1 Distribution in R and Its Application 常见概率分布

r-density

1.1 01. 离散型

1.1.1 1.二项分布Binomial distribution:binom

二项分布指的是N重伯努利实验,记为X ~ b(n,p),E(x)=np,Var(x)=np(1-p)

pbinom(q,size,prob), q是特定取值,比如pbinom(8,20,0.2)指第8次伯努利实验的累计概率。 size指总的实验次数, prob指每次实验成功发生的概率

dbinom(x,size,prob), x同上面的q同含义。dfunction()对于离散分布来说结果是特定值的概率,对连续变量来说是密度(Density)

rbinom(n, size, prob),产生n个b(size,prob)的二项分布随机数

qbinom(p, size, prob),quantile function 分位数函数。 分位数: 若概率0Za)=α的实数。如t分布的分位数表,自由度f=20和α=0.05时的分位数为1.7247。 –这个定义指的是上侧α分位数 α分位数: 实数α满足0 <α<1 时,α分位数是使P{X< xα}="F(xα)=α的数xα" 双侧α分位数是使P{X<λ1}="F(λ1)=0.5α的数λ1、使" P{X>λ2}=1-F(λ2)=0.5α的数λ2。 qbinom是上侧分位数,如qbinom(0.95,100,0.2)=27,指27之后P(x>=27)>=0.95。即对于b(100,0.2)为了达到0.95的概率至少需要27次重复实验。

1.1.2 2.负二项分布negative binomial distribution (帕斯卡分布)nbinom

掷骰子,掷到一即视为成功。则每次掷骰的成功率是1/6。要掷出三次一,所需的掷骰次数属于集合 { 3, 4, 5, 6, … } 。

掷到三次一的掷骰次数是负二项分布的随机变量。

dnbinom(4,3,1/6)=0.0334898,四次连续三次1的概率为这个数。 概率函数为f(k;r,p)=choose(k+r-1,r-1)p^r(1-p)^k, 当r=1时这个特例分布是几何分布

rnbinom(n,size,prob,mu) 其中n是需要产生的随机数个数,size是概率函数中的r,即连续成功的次数,prob是单词成功的概率,mu未知..(mu是希腊字母υ的读音)

1.1.3 3.几何分布Geometric Distribution,geom

n次伯努利试验,前n-1次皆失败,第n次才成功的机率

dgeom(x,prob),注意这里的x取值是0:n,即dgeom(0,0.2)=0.2,以上的二项分布和负二项分布也是如此。

ngeom(n,prob)

1.1.4 4.超几何分布Hypergeometric Distribution,hyper

它描述了由有限个(m+n)物件中抽出k个物件,成功抽出指定种类的物件的次数(不归还)。 概率:p(x) = choose(m, x) choose(n, k-x) / choose(m+n, k) for x = 0, …, k. 当n=1时,这是一个0-1分布即伯努利分布,当n接近无穷大∞时,超几何分布可视为二项分布 rhyper(nn,m,n,k),nn是需要产生的随机数个数,m是白球数(计算目标是取到x个白球的概率),n是黑球数,k是抽取出的球个数 dhyper(x, m, n, k)

1.1.5 5.泊松分布 Poisson Distribution,pois

p(x) = lambda^x exp(-lambda)/x! for x = 0, 1, 2, …. The mean and variance are E(X) = Var(X) = λ. x ~ π(λ) 泊松分布的参数λ是单位时间(或单位面积)内随机事件的平均发生率.泊松分布适合于描述单位时间内随机事件发生的次数。如某一服务设施在一定时间内到达的人数,电话交换机接到呼叫的次数,汽车站台的候客人数,机器出现的故障数,自然灾害发生的次数等等. rpois(n, lambda) dpois(x,lambda)

1.2 02. 连续型

1.2.1 6.均匀分布 Uniform Distribution,unif

均匀分布(Uniform distribution)是均匀的,不偏差的一种简单的概率分布,分为:离散型均匀分布与连续型均匀分布。

f(x) = 1/(max-min) for min <= x <= max. runif(n,min,max). 生成16位数的随机数:as.character(runif(1,1000000000000000,9999999999999999)) dunif(x,min,max)=1,恒定等于1/(max-min). 对于连续变量,dfunction的值是x去特定值代入概率密度函数得到的函数值。

1.2.1.1 6.1 均匀分布-概率密度函数

set.seed(1)
x<-seq(0,10,length.out=1000)
y<-dunif(x,0,1)

plot(x,y,col="red",xlim=c(0,10),ylim=c(0,1.2),type='l',
     xaxs="i", yaxs="i",ylab='density',xlab='',
     main="The Uniform Density Distribution")
lines(x,dnorm(x,0,0.5),col="green")
lines(x,dnorm(x,0,2),col="blue")
lines(x,dnorm(x,-2,1),col="orange")
lines(x,dnorm(x,4,2),col="purple")

legend("topright",legend=paste("m=",c(0,0,0,-2,4)," sd=", c(1,0.5,2,1,2)), lwd=1, col=c("red", "green","blue","orange","purple"))

1.2.1.2 6.2 均匀分布-累积分布函数

f(x) = 0 for x < a f(x) = (x-a)/(b-a) for a<= x <= b f(x) = 1 for x >= b

set.seed(1)
x<-seq(0,10,length.out=1000)
y<-punif(x,0,1)

plot(x,y,col="red",xlim=c(0,10),ylim=c(0,1.2),type='l',
     xaxs="i", yaxs="i",ylab='density',xlab='',
     main="The Uniform Cumulative Distribution Function")

lines(x,punif(x,0,0.5),col="green")
lines(x,punif(x,0,2),col="blue")
lines(x,punif(x,-2,1),col="orange")

legend("bottomright",legend=paste("m=",c(0,0,0,-2)," sd=", c(1,0.5,2,1)), lwd=1, col=c("red", "green","blue","orange","purple"))

1.2.1.3 6.3 均匀分布-分布检验

Kolmogorov-Smirnov连续分布检验: 检验单一样本是不是服从某一预先假设的特定分布的方法。以样本数据的累计频数分布与特定理论分布比较,若两者间的差距很小,则推论该样本取自某特定分布族。

该检验原假设为H0:数据集符合均匀分布,H1:样本所来自的总体分布不符合均匀分布。令F0(x)表示预先假设的理论分布,Fn(x)表示随机样本的累计概率(频率)函数.

统计量D为: D=max|F0(x) - Fn(x)|

D值越小,越接近0,表示样本数据越接近均匀分布 p值,如果p-value小于显著性水平α(0.05),则拒绝H0

set.seed(1)
S<-runif(1000)
ks.test(S, "punif")
#   One-sample Kolmogorov-Smirnov test
# data:  S
# D = 0.0244, p-value = 0.5928
# alternative hypothesis: two-sided

结论: D值很小, p-value>0.05,不能拒绝原假设,所以数据集S符合均匀分布!

1.2.2 7.正态分布Normal Distribution,norm

正态分布(Normal distribution)又名高斯分布(Gaussian distribution),是一个在数学、物理及工程等领域都非常重要的概率分布,在统计学的许多方面有着重大的影响力。

若随机变量X服从一个数学期望为μ、方差为σ2的正态分布,记为N(μ,σ2)。其概率密度函数为正态分布的期望值μ决定了其位置,其标准差σ决定了分布的幅度。因其曲线呈钟形,因此人们又经常称之为钟形曲线。我们通常所说的标准正态分布是μ = 0,σ = 1的正态分布。

1.2.2.1 7.1 正态分布概率密度函数

f(x) = 1/(sqrt(2*pi)*sigma) * e^-((x - mu)^2/(2*sigma^2))

其中mu是均值,sigma是standard deviation标准差 理论上可以证明如果把许多小作用加起来看做一个变量,那么这个变量服从正态分布 rnorm(n,mean=0,sd=1)后两个参数如果不填则默认为0,1。 dnorm(x,mean,sd),sd是标准差。 画出正态分布概率密度函数的大致图形: x<-seq(-3,3,0.1) plot(x,dnorm(x)) plot中的x,y要有相关关系才会形成函数图。 qnorm(p,mean,sd),这个还是上侧分位数,如qnorm(0.05)=-1.644854,即x<=这个数的累计概率小于0.05

3sigma法则:对于正态分布的x,x取值在(mean-3sd,mean+3sd)几乎是在肯定的。 因为pnorm(3)-pnorm(-3)=0.9973002

用正态分布产生一个16位长的随机数字: as.character(10^16*rnorm(1))

set.seed(1)
x <- seq(-5,5,length.out=100)
y <- dnorm(x,0,1)
  
plot(x,y,col="red",xlim=c(-5,5),ylim=c(0,1),type='l',
     xaxs="i", yaxs="i",ylab='density',xlab='',
     main="The Normal Density Distribution")

lines(x,dnorm(x,0,0.5),col="green")
lines(x,dnorm(x,0,2),col="blue")
lines(x,dnorm(x,-2,1),col="orange")

legend("topright",legend=paste("m=",c(0,0,0,-2)," sd=", c(1,0.5,2,1)), lwd=1, col=c("red", "green","blue","orange"))

1.2.2.2 7.2 正态分布累积分布函数

Cumulative Distribution

积分函数 integrate(f,lower,upper)

f(x,mu,sigma) = 1/(sqrt(2*pi)*sigma) * integrate(e^-((x - mu)^2/(2*sigma^2)),-Inf, x)

set.seed(1)
x <- seq(-5,5,length.out=100)
y <- pnorm(x,0,1)

plot(x,y,col="red",xlim=c(-5,5),ylim=c(0,1),type='l',
     xaxs="i", yaxs="i",ylab='density',xlab='',
     main="The Normal Cumulative Distribution")

lines(x,pnorm(x,0,0.5),col="green")
lines(x,pnorm(x,0,2),col="blue")
lines(x,pnorm(x,-2,1),col="orange")

legend("bottomright",legend=paste("m=",c(0,0,0,-2)," sd=", c(1,0.5,2,1)), lwd=1,col=c("red", "green","blue","orange"))

1.2.2.3 7.3 正态分布累积分布检验

Shapiro-Wilk正态分布检验: 用来检验是否数据符合正态分布,类似于线性回归的方法一样,是检验其于回归曲线的残差。该方法推荐在样本量很小的时候使用,样本在3到5000之间。

该检验原假设为H0:数据集符合正态分布,统计量W为: W = (cumsum(a_i*x_i))^2/(cumsum(x_i*mean(x)))^2 i from 1 to n

统计量W 最大值是1,越接近1,表示样本与正态分布匹配 p值,如果p-value小于显著性水平α(0.05),则拒绝H0

set.seed(1)
S<-rnorm(1000)
shapiro.test(S)
#   Shapiro-Wilk normality test
# data:  S
# W = 0.9988, p-value = 0.7256

结论: W接近1,p-value>0.05,不能拒绝原假设,所以数据集S符合正态分布!

1.2.2.4 7.4 Kolmogorov-Smirnov连续分布检验

检验单一样本是不是服从某一预先假设的特定分布的方法。以样本数据的累计频数分布与特定理论分布比较,若两者间的差距很小,则推论该样本取自某特定分布族。

该检验原假设为H0:数据集符合正态分布, H1:样本所来自的总体分布不符合正态分布。 令F0(x)表示预先假设的理论分布,Fn(x)表示随机样本的累计概率(频率)函数.

统计量D为: D=max|F0(x) - Fn(x)|

D值越小,越接近0,表示样本数据越接近正态分布 p值,如果p-value小于显著性水平α(0.05),则拒绝H0

set.seed(1)
S<-rnorm(1000)
ks.test(S, "pnorm")
#   One-sample Kolmogorov-Smirnov test
# data:  S
# D = 0.0211, p-value = 0.7673
# alternative hypothesis: two-sided

结论: D值很小, p-value>0.05,不能拒绝原假设,所以数据集S符合正态分布!

1.2.3 8.伽玛分布Gamma Distribution,gamma

(伽玛分布)[http://zh.wikipedia.org/w/index.PHP?title=伽玛分布&variant=zh-cn]

伽玛分布(Gamma)是著名的皮尔逊概率分布函数簇中的重要一员,称为皮尔逊Ⅲ型分布。它的曲线有一个峰,但左右不对称。

伽玛分布中的参数α,称为形状参数,β称为尺度参数。

假设随机变量X为 等到第α件事发生所需之等候时间。

1.2.3.1 8.1 伽玛分布概率密度函数

f(x)= 1/(β^α * Gamma(α)) * x^(α-1) * e^-(x/β) for x >= 0, α > 0 and β > 0

伽玛函数为 Gamma(α) = integrate(t^(α-1)*e^(-t), 0, Inf) 伽玛函数是阶乘在实数上的泛化。

Gamma分布中的参数α,称为形状参数(shape parameter),即上式中的α,β称为尺度参数(scale parameter)上式中的β E(x)=sα, Var(x)=βα^2. 当shape=1/2,scale=2时,这样的gamma分布是自由度为1的开方分布

http://zh.wikipedia.org/wiki/File:Gamma_distribution_pdf.png

dgamma(x,shape,rate=1,scale=1/rate), 请注意R在这里提供的rate是scale尺度参数的倒数,如果dgamma(0,1,2)则表示dgamma(0,shape=1,rate=2),而非dgamma(0,shape=1,scale=2) pgamma(q, shape, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE)

qgamma(p, shape, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE)

rgamma(n, shape, rate = 1, scale = 1/rate)

set.seed(1)
x<-seq(0,10,length.out=100)
y<-dgamma(x,1,2)

plot(x,y,col="red",xlim=c(0,10),ylim=c(0,2),type='l',
     xaxs="i", yaxs="i",ylab='density',xlab='',
     main="The Gamma Density Distribution")

lines(x,dgamma(x,2,2),col="green")
lines(x,dgamma(x,3,2),col="blue")
lines(x,dgamma(x,5,1),col="orange")
lines(x,dgamma(x,9,1),col="black")

legend("topright",legend=paste("shape=",c(1,2,3,5,9)," rate=", c(2,2,2,1,1)), lwd=1, col=c("red", "green","blue","orange","black"))

1.2.3.2 8.2 伽玛分布累积分布函数

f(x) = γ(k, x/θ)/Gamma(k)

1.2.3.3 8.3 伽玛分布-分布检验

Kolmogorov-Smirnov连续分布检验: 检验单一样本是不是服从某一预先假设的特定分布的方法。以样本数据的累计频数分布与特定理论分布比较,若两者间的差距很小,则推论该样本取自某特定分布族。

该检验原假设为H0:数据集符合伽玛分布,H1:样本所来自的总体分布不符合伽玛分布。令F0(x)表示预先假设的理论分布,Fn(x)表示随机样本的累计概率(频率)函数.

统计量D为: D=max|F0(x) - Fn(x)|

D值越小,越接近0,表示样本数据越接近伽玛分布 p值,如果p-value小于显著性水平α(0.05),则拒绝H0

set.seed(1)
S<-rgamma(1000,1)
ks.test(S, "pgamma", 1)
#   One-sample Kolmogorov-Smirnov test
# data:  S
# D = 0.0363, p-value = 0.1438
# alternative hypothesis: two-sided

结论: D值很小, p-value>0.05,不能拒绝原假设,所以数据集S符合shape=1伽玛分布!

检验失败:

ks.test(S, "pgamma", 2)
#   One-sample Kolmogorov-Smirnov test
# data:  S
# D = 0.3801, p-value < 2.2e-16
# alternative hypothesis: two-sided

结论:D值不够小, p-value<0.05,拒绝原假设,所以数据集S符合shape=2伽玛分布!

1.2.4 9.指数分布Exponential Distribution,exp

指数分布(Exponential distribution)用来表示独立随机事件发生的时间间隔,比如旅客进机场的时间间隔、中文维基百科新条目出现的时间间隔等等。

许多电子产品的寿命分布一般服从指数分布。有的系统的寿命分布也可用指数分布来近似。它在可靠性研究中是最常用的一种分布形式。指数分布是伽玛分布和weibull分布的特殊情况,产品的失效是偶然失效时,其寿命服从指数分布。

指数分布可以看作当weibull分布中的形状系数等于1的特殊分布,指数分布的失效率是与时间t无关的常数,所以分布函数简单。记作X ~ Exponential(λ)。

1.2.4.1 9.1 指数分布概率密度函数

f(x) = λ*e^(-λ*x) for x >= 0 f(x) = 0 for x < 0.

其中lambda λ > 0是分布的一个参数,常被称为率参数(rate parameter).即每单位时间发生该事件的次数。指数分布的区间是[0,∞)。 如果一个随机变量X 呈指数分布,则可以写作:X ~ Exponential(λ)。 E(x)=1/λ,Var(x)=1/λ^2

dexp(x, rate = 1, log = FALSE)

pexp(q, rate = 1, lower.tail = TRUE, log.p = FALSE)

qexp(p, rate = 1, lower.tail = TRUE, log.p = FALSE)

rexp(n, rate = 1)

假设在公交站台等公交车平均10分钟有一趟车,那么每小时候有6趟车,即每小时出现车的次数~ Exponential(1/6) 我们可以产生10个这些随机数看看rexp(10,1/6) 60/(rexp10,1/6)即为我们在站台等车的随机时间,如下: [1] 6.443148 24.337131 6.477096 2.824638 15.184945 14.594903 [7] 7.133842 8.222400 42.609784 15.182827 可以看见竟然有一个42.6分钟的随机数出现,据说这种情况下你可以投诉上海的公交公司。 不过x符合指数分布,1/x还符合指数分布吗? pexp(6,1/6)=0.6321206, 也就是说这种情况下只有37%的可能公交车会10分钟以内来。 按照以上分析一个小时出现的公交车次数应该不符合指数分布。

set.seed(1)
x<-seq(-1,2,length.out=100)
y<-dexp(x,0.5)

plot(x,y,col="red",xlim=c(0,2),ylim=c(0,5),type='l',
     xaxs="i", yaxs="i",ylab='density',xlab='',
     main="The Exponential Density Distribution")
lines(x,dexp(x,1),col="green")
lines(x,dexp(x,2),col="blue")
lines(x,dexp(x,5),col="orange")

legend("topright",legend=paste("rate=",c(.5, 1, 2,5)), lwd=1,col=c("red", "green","blue","orange"))

1.2.4.2 9.2 指数分布累积分布函数

f(x, λ) = 1-e^(-λ*x) for x >= 0 f(x, λ) = 0 for x < 0.

set.seed(1)
x<-seq(-1,2,length.out=100)
y<-pexp(x,0.5)

plot(x,y,col="red",xlim=c(0,2),ylim=c(0,1),type='l',
     xaxs="i", yaxs="i",ylab='density',xlab='',
     main="The Exponential Cumulative Distribution Function")
lines(x,pexp(x,1),col="green")
lines(x,pexp(x,2),col="blue")
lines(x,pexp(x,5),col="orange")

legend("bottomright",legend=paste("rate=",c(.5, 1, 2,5)), lwd=1, col=c("red", "green","blue","orange"))

1.2.4.3 9.3 指数分布-分布检验

Kolmogorov-Smirnov连续分布检验:检验单一样本是不是服从某一预先假设的特定分布的方法。以样本数据的累计频数分布与特定理论分布比较,若两者间的差距很小,则推论该样本取自某特定分布族。

该检验原假设为H0:数据集符合指数分布,H1:样本所来自的总体分布不符合指数分布。令F0(x)表示预先假设的理论分布,Fn(x)表示随机样本的累计概率(频率)函数.

统计量D为: D=max|F0(x) - Fn(x)|

D值越小,越接近0,表示样本数据越接近指数分布 p值,如果p-value小于显著性水平α(0.05),则拒绝H0

set.seed(1)
S<-rexp(1000)
ks.test(S, "pexp")
#   One-sample Kolmogorov-Smirnov test
# data:  S
# D = 0.0387, p-value = 0.1001
# alternative hypothesis: two-sided

结论: D值很小, p-value>0.05,不能拒绝原假设,所以数据集S符合指数分布!

1.2.5 10.卡方分布(non-central)Chi-Squared Distribution,chisq

χ²(卡方)分布 若n个相互独立的随机变量ξ₁、ξ₂、……、ξn ,均服从标准正态分布(也称独立同分布于标准正态分布),则这n个服从标准正态分布的随机变量的平方和构成一新的随机变量,其分布规律称为χ²分布(chi-square distribution)。其中参数n称为自由度,自由度不同就是另一个χ²分布,正如正态分布中均值或方差不同就是另一个正态分布一样。

它广泛的运用于检测数学模型是否适合所得的数据,以及数据间的相关性。数据并不需要呈正态分布 k个标准正态变量的平方和即为自由度为k的卡方分布。 E(x)=k,Var(x)=2k.

dchisq(x, df, ncp=0, log = FALSE)

pchisq(q, df, ncp=0, lower.tail = TRUE, log.p = FALSE)

qchisq(p, df, ncp=0, lower.tail = TRUE, log.p = FALSE)

rchisq(n, df, ncp=0) 其中df为degrees of freedom。ncp是non-centrality parameter (non-negative).ncp=0时是central卡方分布,ncp不为0时,表示这个卡方分布是由非标准正态分布组合而成,ncp=这些正态分布的均值的平方和。

1.2.5.1 10.1 卡方分布概率密度函数

γ 是伽玛函数

set.seed(1)
x<-seq(0,10,length.out=1000)
y<-dchisq(x,1)

plot(x,y,col="red",xlim=c(0,5),ylim=c(0,2),type='l',
     xaxs="i", yaxs="i",ylab='density',xlab='',
     main="The Chisq Density Distribution")

lines(x,dchisq(x,2),col="green")
lines(x,dchisq(x,3),col="blue")
lines(x,dchisq(x,10),col="orange")

legend("topright",legend=paste("df=",c(1,2,3,10)), lwd=1, col=c("red", "green","blue","orange"))

1.2.5.2 10.2 卡方分布累积分布函数

γ 是伽玛函数

set.seed(1)
x<-seq(0,10,length.out=1000)
y<-pchisq(x,1)

plot(x,y,col="red",xlim=c(0,10),ylim=c(0,1),type='l',
     xaxs="i", yaxs="i",ylab='density',xlab='',
     main="The Chisq Cumulative Distribution Function")

lines(x,pchisq(x,2),col="green")
lines(x,pchisq(x,3),col="blue")
lines(x,pchisq(x,10),col="orange")

legend("topleft",legend=paste("df=",c(1,2,3,10)), lwd=1, col=c("red", "green","blue","orange"))

1.2.5.3 10.3 卡方分布-分布检验

Kolmogorov-Smirnov连续分布检验: 检验单一样本是不是服从某一预先假设的特定分布的方法。以样本数据的累计频数分布与特定理论分布比较,若两者间的差距很小,则推论该样本取自某特定分布族。

该检验原假设为H0:数据集符合卡方分布,H1:样本所来自的总体分布不符合卡方分布。令F0(x)表示预先假设的理论分布,Fn(x)表示随机样本的累计概率(频率)函数.

统计量D为: D=max|F0(x) - Fn(x)|

D值越小,越接近0,表示样本数据越接近卡方分布 p值,如果p-value小于显著性水平α(0.05),则拒绝H0

set.seed(1)
S<-rchisq(1000,1)
ks.test(S, "pchisq",1)
#   One-sample Kolmogorov-Smirnov test
# data:  S
# D = 0.0254, p-value = 0.5385
# alternative hypothesis: two-sided

结论: D值很小, p-value>0.05,不能拒绝原假设,所以数据集S符合df=1的卡方分布!

1.2.6 11.β分布Beta Distribution,beta

贝塔分布(Beta Distribution)是指一组定义在(0,1)区间的连续概率分布,Beta分布有α和β两个参数α,β>0,其中α为成功次数加1,β为失败次数加1。

Beta分布的一个重要应该是作为伯努利分布和二项式分布的共轭先验分布出现,在机器学习和数理统计学中有重要应用。贝塔分布中的参数可以理解为伪计数,伯努利分布的似然函数可以表示为,表示一次事件发生的概率,它为贝塔有相同的形式,因此可以用贝塔分布作为其先验分布。

变量x仅能出现于0到1之间。 空气中含有的气体状态的水分。表示这种水分的一种办法就是相对湿度。即现在的含水量与空气的最大含水量(饱和含水量)的比值。我们听到的天气预告用语中就经常使用相对湿度这个名词。 相对湿度的值显然仅能出现于0到1之间(经常用百分比表示)。冬季塔里木盆地的日最大相对湿度和夏季日最小相对湿度。证实它们都符合贝塔分布 dbeta(x, shape1, shape2, ncp = 0, log = FALSE)

pbeta(q, shape1, shape2, ncp = 0, lower.tail = TRUE, log.p = FALSE)

qbeta(p, shape1, shape2, ncp = 0, lower.tail = TRUE, log.p = FALSE)

rbeta(n, shape1, shape2, ncp = 0)

shape1,shape2是beta分布的两个参数。E(x)=s1/(s1+s2),var(x)=s1s2/(s1+s2)^2 (s1+s2+1)

1.2.6.1 11.1 Beta分布概率密度函数

随机变量X服从参数为a, β,服从Beta分布 γ 是伽玛函数

set.seed(1)
x<-seq(-5,5,length.out=10000)
y<-dbeta(x,0.5,0.5)
  
plot(x,y,col="red",xlim=c(0,1),ylim=c(0,6),type='l',
     xaxs="i", yaxs="i",ylab='density',xlab='',
     main="The Beta Density Distribution")

lines(x,dbeta(x,5,1),col="green")
lines(x,dbeta(x,1,3),col="blue")
lines(x,dbeta(x,2,2),col="orange")
lines(x,dbeta(x,2,5),col="black")

legend("top",legend=paste("a=",c(.5,5,1,2,2)," b=", c(.5,1,3,2,5)), lwd=1,col=c("red", "green","blue","orange","black"))

1.2.6.2 11.2 Beta分布-累积分布函数

set.seed(1)
x<-seq(-5,5,length.out=10000)
y<-pbeta(x,0.5,0.5)

plot(x,y,col="red",xlim=c(0,1),ylim=c(0,1),type='l',
     xaxs="i", yaxs="i",ylab='density',xlab='',
     main="The Beta Cumulative Distribution Function")

lines(x,pbeta(x,5,1),col="green")
lines(x,pbeta(x,1,3),col="blue")
lines(x,pbeta(x,2,2),col="orange")
lines(x,pbeta(x,2,5),col="black")

legend("topleft",legend=paste("a=",c(.5,5,1,2,2)," b=", c(.5,1,3,2,5)), lwd=1,col=c("red", "green","blue","orange","black"))

1.2.6.3 11.3 Beta分布-分布检验

Kolmogorov-Smirnov连续分布检验: 检验单一样本是不是服从某一预先假设的特定分布的方法。以样本数据的累计频数分布与特定理论分布比较,若两者间的差距很小,则推论该样本取自某特定分布族。

该检验原假设为H0:数据集符合Beta分布,H1:样本所来自的总体分布不符合Beta分布。令F0(x)表示预先假设的理论分布,Fn(x)表示随机样本的累计概率(频率)函数.

统计量D为: D=max|F0(x) - Fn(x)|

D值越小,越接近0,表示样本数据越接近Beta分布 p值,如果p-value小于显著性水平α(0.05),则拒绝H0

set.seed(1)
S<-rbeta(1000,1,2)
ks.test(S, "pbeta",1,2)
#   One-sample Kolmogorov-Smirnov test
# data:  S
# D = 0.0202, p-value = 0.807
# alternative hypothesis: two-sided

结论: D值很小, p-value>0.05,不能拒绝原假设,所以数据集S符合shape1=1, shape2=2的Beta分布!

1.2.7 12.t分布Student t Distribution,t

学生t-分布(Student’s t-distribution),可简称为t分布。应用在估计呈正态分布的母群体之平均数。它是对两个样本均值差异进行显著性测试的学生t检定的基础。学生t检定改进了Z检定(Z-test),因为Z检定以母体标准差已知为前提。虽然在样本数量大(超过30个)时,可以应用Z检定来求得近似值,但Z检定用在小样本会产生很大的误差,因此必须改用学生t检定以求准确。

在母体标准差未知的情况下,不论样本数量大或小皆可应用学生t检定。在待比较的数据有三组以上时,因为误差无法压低,此时可以用变异数分析(ANOVA)代替学生t检定。

应用在当对呈正态分布的母群体的均值进行估计。当母群体的标准差是未知的但却又需要估计时,我们可以运用学生t 分布。 学生t 分布可简称为t 分布。其推导由威廉·戈塞于1908年首先发表,当时他还在都柏林的健力士酿酒厂工作。因为不能以他本人的名义发表,所以论文使用了学生(Student)这一笔名。之后t 检验以及相关理论经由罗纳德·费雪的工作发扬光大,而正是他将此分布称为学生分布。 dt(x, df, ncp, log = FALSE)

pt(q, df, ncp, lower.tail = TRUE, log.p = FALSE)

qt(p, df, ncp, lower.tail = TRUE, log.p = FALSE)

rt(n, df, ncp) 其中df是自由度,ncp是non-centrality parameter delta,If omitted, use the central t distribution。ncp出现时表示分布由非标准的卡方分布构成。

1.2.7.1 12.1 概率密度函数

v 等于n − 1。 T的分布称为t-分布。参数一般被称为自由度。 γ 是伽玛函数。

set.seed(1)
x<-seq(-5,5,length.out=1000)
y<-dt(x,1,0)

plot(x,y,col="red",xlim=c(-5,5),ylim=c(0,0.5),type='l',
     xaxs="i", yaxs="i",ylab='density',xlab='',
     main="The T Density Distribution")

lines(x,dt(x,5,0),col="green")
lines(x,dt(x,5,2),col="blue")
lines(x,dt(x,50,4),col="orange")

legend("topleft",legend=paste("df=",c(1,5,5,50)," ncp=", c(0,0,2,4)), lwd=1, col=c("red", "green","blue","orange"))

1.2.7.2 12.2 T分布-累积分布函数

v 等于n − 1。 T的分布称为t-分布。参数一般被称为自由度。 γ 是伽玛函数。

set.seed(1)
x<-seq(-5,5,length.out=1000)
y<-pt(x,1,0)

plot(x,y,col="red",xlim=c(-5,5),ylim=c(0,0.5),type='l',
     xaxs="i", yaxs="i",ylab='density',xlab='',
     main="The T Cumulative Distribution Function")

lines(x,pt(x,5,0),col="green")
lines(x,pt(x,5,2),col="blue")
lines(x,pt(x,50,4),col="orange")

legend("topleft",legend=paste("df=",c(1,5,5,50)," ncp=", c(0,0,2,4)), lwd=1, col=c("red", "green","blue","orange"))

1.2.7.3 12.3 T分布-分布检验

Kolmogorov-Smirnov连续分布检验: 检验单一样本是不是服从某一预先假设的特定分布的方法。以样本数据的累计频数分布与特定理论分布比较,若两者间的差距很小,则推论该样本取自某特定分布族。

该检验原假设为H0:数据集符合T分布,H1:样本所来自的总体分布不符合T分布。令F0(x)表示预先假设的理论分布,Fn(x)表示随机样本的累计概率(频率)函数.

统计量D为: D=max|F0(x) - Fn(x)|

D值越小,越接近0,表示样本数据越接近T分布 p值,如果p-value小于显著性水平α(0.05),则拒绝H0

set.seed(1)
S<-rt(1000, 1,2)
ks.test(S, "pt", 1, 2)
#   One-sample Kolmogorov-Smirnov test
# data:  S
# D = 0.0253, p-value = 0.5461
# alternative hypothesis: two-sided

结论: D值很小, p-value>0.05,不能拒绝原假设,所以数据集S符合df1=1, ncp=2的T分布!

1.2.8 13.F分布

F-分布(F-distribution)是一种连续概率分布,被广泛应用于似然比率检验,特别是ANOVA中。F分布定义为:设X、Y为两个独立的随机变量,X服从自由度为k1的卡方分布,Y服从自由度为k2的卡方分布,这2 个独立的卡方分布被各自的自由度除以后的比率这一统计量的分布。即: 上式F服从第一自由度为k1,第二自由度为k2的F分布。

F分布的性质

它是一种非对称分布

它有两个自由度,即n1 -1和n2-1,相应的分布记为F( n1 –1, n2-1), n1 –1通常称为分子自由度, n2-1通常称为分母自由度

F分布是一个以自由度n1 –1和n2-1为参数的分布族,不同的自由度决定了F 分布的形状

F分布的倒数性质:Fα,df1,df2=1/F1-α,df1,df2[1]

一个F-分布的随机变量是两个卡方分布变量的比率。F-分布被广泛应用于似然比率检验,特别是方差分析中 df(x, df1, df2, ncp, log = FALSE)

pf(q, df1, df2, ncp, lower.tail = TRUE, log.p = FALSE)

qf(p, df1, df2, ncp, lower.tail = TRUE, log.p = FALSE)

rf(n, df1, df2, ncp) df1,df2是两个自由度,ncp同t分布中的ncp。

1.2.8.1 13.1 F分布的概率密度函数

f(x) = sqrt(((d_1*x)^d_1 * d_2^d_2)/((d_1*x + d_2)^(d_1 + d_2)))/(x * B(d_1/2,d_2/2))

B是Beta函数(beta function)

set.seed(1)
x<-seq(0,5,length.out=1000)
y<-df(x,1,1,0)

plot(x,y,col="red",xlim=c(0,5),ylim=c(0,1),type='l',
     xaxs="i", yaxs="i",ylab='density',xlab='',
     main="The F Density Distribution")

lines(x,df(x,1,1,2),col="green")
lines(x,df(x,2,2,2),col="blue")
lines(x,df(x,2,4,4),col="orange")

legend("topright",legend=paste("df1=",c(1,1,2,2),"df2=",c(1,1,2,4)," ncp=", c(0,2,2,4)), lwd=1, col=c("red", "green","blue","orange"))

1.2.8.2 13.2 F分布的累积分布函数

f(x) = I是不完全Beta函数

set.seed(1)
x<-seq(0,5,length.out=1000)
y<-df(x,1,1,0)

plot(x,y,col="red",xlim=c(0,5),ylim=c(0,1),type='l',
     xaxs="i", yaxs="i",ylab='density',xlab='',
     main="The F Cumulative Distribution Function")

lines(x,pf(x,1,1,2),col="green")
lines(x,pf(x,2,2,2),col="blue")
lines(x,pf(x,2,4,4),col="orange")

legend("topright",legend=paste("df1=",c(1,1,2,2),"df2=",c(1,1,2,4)," ncp=", c(0,2,2,4)), lwd=1, col=c("red", "green","blue","orange"))

1.2.8.3 13.3 F分布-分布检验

Kolmogorov-Smirnov连续分布检验: 检验单一样本是不是服从某一预先假设的特定分布的方法。以样本数据的累计频数分布与特定理论分布比较,若两者间的差距很小,则推论该样本取自某特定分布族。

该检验原假设为H0:数据集符合F分布,H1:样本所来自的总体分布不符合F分布。令F0(x)表示预先假设的理论分布,Fn(x)表示随机样本的累计概率(频率)函数.

统计量D为: D=max|F0(x) - Fn(x)|

D值越小,越接近0,表示样本数据越接近F分布 p值,如果p-value小于显著性水平α(0.05),则拒绝H0

set.seed(1)
S<-rf(1000,1,1,2)
ks.test(S, "pf", 1,1,2)
#   One-sample Kolmogorov-Smirnov test
# data:  S
# D = 0.0113, p-value = 0.9996
# alternative hypothesis: two-sided

结论: D值很小, p-value>0.05,不能拒绝原假设,所以数据集S符合df1=1, df2=1, ncp=2的F分布!

1.2.9 14. 韦伯分布-韦氏分布-威布尔分布-weibull分布

weibull(韦伯)分布,又称韦氏分布或威布尔分布,是可靠性分析和寿命检验的理论基础。Weibull分布能被应用于很多形式,分布由形状、尺度(范围)和位置三个参数决定。其中形状参数是最重要的参数,决定分布密度曲线的基本形状,尺度参数起放大或缩小曲线的作用,但不影响分布的形状。

Weibull分布通常用在故障分析领域( field of failure analysis)中;尤其是它可以模拟(mimic) 故障率(failture rate)持续( over time)变化的分布。故障率为:

一直为常量(constant over time), 那么 α = 1, 暗示在随机事件中发生 一直减少(decreases over time),那么α < 1, 暗示“早期失效(infant mortality)” 一直增加(increases over time),那么α > 1, 暗示“耗尽(wear out)” - 随着时间的推进,失败的可能性变大

1.2.9.1 14.1 韦伯分布概率密度函数

f(x,λ,k) = (k/λ) * (x/λ)^e^((-λ*x)^k) for x >= 0 f(x,λ,k) = 0 for x < 0.

set.seed(1)
x<- seq(0, 2.5, length.out=1000)
y<- dweibull(x, 0.5)

plot(x, y, type="l", col="blue",xlim=c(0, 2.5),ylim=c(0, 6),
     xaxs="i", yaxs="i",ylab='density',xlab='',
     main="The Weibull Density Distribution")

lines(x, dweibull(x, 1), type="l", col="red")
lines(x, dweibull(x, 1.5), type="l", col="magenta")
lines(x, dweibull(x, 5), type="l", col="green")
lines(x, dweibull(x, 15), type="l", col="purple")
legend("topright", legend=paste("shape =", c(.5, 1, 1.5, 5, 15)), lwd=1,col=c("blue", "red", "magenta", "green","purple"))

1.2.9.2 14.2 韦伯分布累积分布函数

f(x) = 1 - e^(-(x/λ)^k)

set.seed(1)
x<- seq(0, 2.5, length.out=1000)
y<- pweibull(x, 0.5)

plot(x, y, type="l", col="blue",xlim=c(0, 2.5),ylim=c(0, 1.2),
     xaxs="i", yaxs="i",ylab='density',xlab='',
     main="The Weibull Cumulative Distribution Function")

lines(x, pweibull(x, 1), type="l", col="red")
lines(x, pweibull(x, 1.5), type="l", col="magenta")
lines(x, pweibull(x, 5), type="l", col="green")
lines(x, pweibull(x, 15), type="l", col="purple")
legend("bottomright", legend=paste("shape =", c(.5, 1, 1.5, 5, 15)), lwd=1, col=c("blue", "red", "magenta", "green","purple"))

1.2.9.3 14.3 韦伯分布-分布检验

Kolmogorov-Smirnov连续分布检验: 检验单一样本是不是服从某一预先假设的特定分布的方法。以样本数据的累计频数分布与特定理论分布比较,若两者间的差距很小,则推论该样本取自某特定分布族。

该检验原假设为H0:数据集符合weibull分布,H1:样本所来自的总体分布不符合weibull分布。令F0(x)表示预先假设的理论分布,Fn(x)表示随机样本的累计概率(频率)函数.

统计量D为: D=max|F0(x) - Fn(x)|

D值越小,越接近0,表示样本数据越接近weibull分布 p值,如果p-value小于显著性水平α(0.05),则拒绝H0

set.seed(1)
S<-rweibull(1000,1)
ks.test(S, "pweibull",1)
#   One-sample Kolmogorov-Smirnov test
# data:  S
# D = 0.0244, p-value = 0.5928
# alternative hypothesis: two-sided

结论: D值很小, p-value>0.05,不能拒绝原假设,所以数据集S符合shape=1的weibull分布!

在我们掌握了,这几种常用的连续型分布后,我们就可以基于这些分布来建模了,很多的算法模型就能解释通了!!

1.3 概率分布函数的四种形式

内容有助于理解R的概率分布的几种函数语法,特汇总如下:

1.3.1 1、概率密度函数

定义:对任一个随机变量X,存在一个函数f(x),满足以上条件,那么就说,f(x)是X的概率密度函数:

意义说明:描述随机变量在某一个确定取值点的可能性的函数,或者说是瞬时增幅的一个函数:

1.3.2 2、累积分布函数

定义:对任一随机变量X,对于任意给定值a,所有小于值a出现的概率和,就是随机变量X的分布函数,分布函数可以唯一决定一个随机变量:

性质:(1)有界性;(2)单调性;(3)右连续性。

累积分布函数由于英文为Cumulative Distribution Function,所以经常简称为CDF。

1.3.3 3、分位数函数

定义:分位数函数是累积分布函数的反函数,也就是说,给定概率值,计算出随机变量的取值(左侧分位数)。

常用的有四个分布的分位数:

标准正态分布,qnorm(p, mean=0, sd=1)

Student’s (t) , qt(p,df=N,ncp=0)

卡方分布:qchisq(p, df=N,ncp=0)

Fisher-Snedecor:qf(p, df1,df2,ncp=0)

特例:四分位数

定义:四分位数是统计学中分位数的一种,即把所有的数值从小到大朴烈并分为四等分,处于三个分割点的数就是四分位数。

1.3.4 4、随机数函数

定义,从一个给定函数的的取值中随机挑出一个自变量,输出的是因变量的值。

1.3.5 5、几个常见的随机变量的四种函数形式:

1.3.5.1 (1)The Normal Distribution

Usage: dnorm(x, mean = 0, sd = 1, log = FALSE) pnorm(q, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE) qnorm(p, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE) rnorm(n, mean = 0, sd = 1)

Arguments: x,q vector of quantiles. p vector of probabilities. n number of observations. If length(n) > 1, the length is taken to be the number required. mean vector of means. sd vector of standard deviations. log, log.p logical; if TRUE, probabilities p are given as log(p). lower.tail logical; if TRUE (default), probabilities are P[X ≤ x] otherwise, P[X > x]

1.3.5.2 (2)卡方分布

Usage: dchisq(x, df, ncp=0, log = FALSE) pchisq(q, df, ncp=0, lower.tail = TRUE, log.p = FALSE) qchisq(p, df, ncp=0, lower.tail = TRUE, log.p = FALSE) rchisq(n, df, ncp=0) Arguments: x, q vector of quantiles. p vector of probabilities. n number of observations. If length(n) > 1, the length is taken to be the number required. df degrees of freedom (non-negative, but can be non-integer). ncp non-centrality parameter (non-negative). log, log.p logical; if TRUE, probabilities p are given as log(p). lower.tail logical; if TRUE (default), probabilities are P[X ≤ x], otherwise, P[X > x].

1.3.5.3 (3)F分布

Usage: df(x, df1, df2, ncp, log = FALSE) pf(q, df1, df2, ncp, lower.tail = TRUE, log.p = FALSE) qf(p, df1, df2, ncp, lower.tail = TRUE, log.p = FALSE) rf(n, df1, df2, ncp) Arguments: x, q vector of quantiles. p vector of probabilities. n number of observations. If length(n) > 1, the length is taken to be the number required. df1, df2 degrees of freedom. Inf is allowed. ncp non-centrality parameter. If omitted the central F is assumed. log, log.p logical; if TRUE, probabilities p are given as log(p). lower.tail logical; if TRUE (default), probabilities are P[X ≤ x], otherwise, P[X > x].

1.3.5.4 (4)T分布

Usage: dt(x, df, ncp, log = FALSE) pt(q, df, ncp, lower.tail = TRUE, log.p = FALSE) qt(p, df, ncp, lower.tail = TRUE, log.p = FALSE) rt(n, df, ncp) Arguments: x, q vector of quantiles. p vector of probabilities. n number of observations. If length(n) > 1, the length is taken to be the number required. df degrees of freedom (> 0, maybe non-integer). df = Inf is allowed. ncp non-centrality parameter delta; currently except for rt(), only for abs(ncp) <= 37.62. If omitted, use the central t distribution. log, log.p logical; if TRUE, probabilities p are given as log(p). lower.tail logical; if TRUE (default), probabilities are P[X ≤ x], otherwise, P[X > x].

1.4 数学与统计相关函数与术语


################
###计算
################

#四则运算 +, -, *, /, ^, %%, %/%
#舍入 ceiling,floor,round,signif,trunc,zapsmall
#最大最小值 max,min,pmax,pmin
#最大值和最小值 range
#向量元素和,积 sum,prod
#累加、累乘 cumsum,cumprod,cummax,cummin
#排序 sort
#插值 approx和approx fun
#差分 diff
#符号函数 sign

################
###数学函数
################

#绝对值,平方根 abs,sqrt
#对数与指数函数 log, exp, log10, log2
#三角函数 sin,cos,tan,asin,acos,atan,atan2
#双曲函数 sinh,cosh,tanh,asinh,acosh,atanh
#与贝塔函数、伽玛函数、组合数有关的特殊函数 beta,lbeta,gamma,lgamma,digamma,trigamma,tetragamma,pentagamma,choose ,lchoose
#富利叶变换及卷积 fft,mvfft,convolve
#多项式求根 polyroot
#正交多项式 poly
#样条差值 spline,splinefun
#函数 besselI,besselK,besselJ,besselY,gammaCodyBessel
#简单表达式的符号微分或算法微分 deriv

################
###线性代数
################
#解线性方程组或求逆 solve
#矩阵的特征值分解 eigen
#矩阵的奇异值分解 svd
#解上三角或下三角方程组 backsolve
#分解 cholCholeski
#矩阵的QR分解 qr
#由Choleski分解求逆 chol2inv

################
###优化及求根
################
#一维优化与求根 optimize uniroot polyroot

################
###统计分布
################
#每一种分布有四个函数
#比如,正态分布的这四个函数为dnorm,pnorm,qnorm,rnorm。
# d――density(密度函数)
# p――分布函数
# q――分位数函数
# r――随机数函数

#下面我们列出各分布后缀,前面加前缀d、p、q或r就构成函数名
#正态 norm
#分布 tt
#分布 fF
#卡方(包括非中心) chisq
#均匀 unif
#指数 exp
#威布尔 weibull
#伽玛 gamma
#贝塔 beta 
#对数正态 lnorm
#逻辑分布 logis
#柯西 cauchy
#二项分布 binom
#几何分布 geom
#超几何 hyper
#负二项 nbinom
#泊松 pois

#符号秩 signrank
#秩和 wilcox
#学生化极差 tukey

################
###简单统计量
################
#基本统计量
#求和 sum
#求平均 mean
#方差 var
#标准差 sd
#最小值 min
#最大值 max
#最小和最大值 range
#中位数 median
#四分位间距 IQR
#与排序有关 sort order rank
#其它还有 ave fivenum mad quantile stem 

################
###统计检验
################
#R中已实现的有 chisq.test,prop.test,t.test

################
###多元分析
################
#协方差阵及相关阵计算 cor,cov.wt,var
#多元数据 biplot, biplot.princomp
#典则相关 biplot cancor
#主成分分析 princomp
#谱系聚类 hclust
#k-均值聚类 kmeans
#经典多维标度 cmdscale
#其它有  dist,mahalanobis,cov.rob

################
###时间序列
################
#时间序列对象 ts
#计算差分 diff
#时间序列的采样时间 time
#时间窗 window

################
###统计模型
################
# 线性模型 lm
# 广义线性模型 glm
# 方差分析 aov
LS0tDQp0aXRsZTogIkRpc3RyaWJ1dGlvbiBpbiBSIE5vdGVib29rIg0KYXV0aG9yOiAiU3RvbmVfSG91Ig0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdGhlbWU6IHJlYWRhYmxlDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCi0tLQ0KDQojIERpc3RyaWJ1dGlvbiBpbiBSIGFuZCBJdHMgQXBwbGljYXRpb24g5bi46KeB5qaC546H5YiG5biDDQogDQo+IFtyLWRlbnNpdHldKGh0dHA6Ly9ibG9nLmZlbnMubWUvci1kZW5zaXR5LykNCg0KIyMgMDEuIOemu+aVo+Weiw0KDQojIyMgMS7kuozpobnliIbluINCaW5vbWlhbCBkaXN0cmlidXRpb27vvJpiaW5vbQ0KDQrkuozpobnliIbluIPmjIfnmoTmmK9O6YeN5Lyv5Yqq5Yip5a6e6aqM77yM6K6w5Li6WCB+IGIobixwKe+8jEUoeCk9bnAsVmFyKHgpPW5wKDEtcCkNCg0KcGJpbm9tKHEsc2l6ZSxwcm9iKe+8jCBx5piv54m55a6a5Y+W5YC877yM5q+U5aaCcGJpbm9tKDgsMjAsMC4yKeaMh+esrDjmrKHkvK/liqrliKnlrp7pqoznmoTntK/orqHmpoLnjofjgIINCnNpemXmjIfmgLvnmoTlrp7pqozmrKHmlbDvvIwNCnByb2LmjIfmr4/mrKHlrp7pqozmiJDlip/lj5HnlJ/nmoTmpoLnjocNCg0KZGJpbm9tKHgsc2l6ZSxwcm9iKSwgeOWQjOS4iumdoueahHHlkIzlkKvkuYnjgIJkZnVuY3Rpb24oKeWvueS6juemu+aVo+WIhuW4g+adpeivtOe7k+aenOaYr+eJueWumuWAvOeahOamgueOh++8jOWvuei/nue7reWPmOmHj+adpeivtOaYr+WvhuW6pu+8iERlbnNpdHnvvIkNCg0KcmJpbm9tKG4sIHNpemUsIHByb2Ip77yM5Lqn55SfbuS4qmIoc2l6ZSxwcm9iKeeahOS6jOmhueWIhuW4g+maj+acuuaVsA0KDQpxYmlub20ocCwgc2l6ZSwgcHJvYikscXVhbnRpbGUgZnVuY3Rpb24g5YiG5L2N5pWw5Ye95pWw44CCDQrliIbkvY3mlbDvvJoNCuiLpeamgueOhzA8cDwx77yM6ZqP5py65Y+Y6YePWOaIluWug+eahOamgueOh+WIhuW4g+eahOWIhuS9jeaVsFph44CC5piv5oyH5ruh6Laz5p2h5Lu2cChYPlphKT3OseeahOWunuaVsOOAguWmgnTliIbluIPnmoTliIbkvY3mlbDooajvvIzoh6rnlLHluqZmPTIw5ZKMzrE9MC4wNeaXtueahOWIhuS9jeaVsOS4ujEuNzI0N+OAgiAtLei/meS4quWumuS5ieaMh+eahOaYr+S4iuS+p86x5YiG5L2N5pWwDQrOseWIhuS9jeaVsO+8mg0K5a6e5pWwzrHmu6HotrMwIDzOsTwxIOaXtu+8jM6x5YiG5L2N5pWw5piv5L2/UHtYPCB4zrF9PUYoeM6xKT3OseeahOaVsHjOsQ0K5Y+M5L6nzrHliIbkvY3mlbDmmK/kvb9Qe1g8zrsxfT1GKM67MSk9MC41zrHnmoTmlbDOuzHjgIHkvb8gUHtYPs67Mn09MS1GKM67Mik9MC41zrHnmoTmlbDOuzLjgIINCnFiaW5vbeaYr+S4iuS+p+WIhuS9jeaVsO+8jOWmgnFiaW5vbSgwLjk1LDEwMCwwLjIpPTI3LOaMhzI35LmL5ZCOUCh4Pj0yNyk+PTAuOTXjgILljbPlr7nkuo5iKDEwMCwwLjIp5Li65LqG6L6+5YiwMC45NeeahOamgueOh+iHs+WwkemcgOimgTI35qyh6YeN5aSN5a6e6aqM44CCDQogDQojIyMgMi7otJ/kuozpobnliIbluINuZWdhdGl2ZSBiaW5vbWlhbCBkaXN0cmlidXRpb24g77yI5biV5pav5Y2h5YiG5biD77yJbmJpbm9tDQoNCuaOt+mqsOWtkO+8jOaOt+WIsOS4gOWNs+inhuS4uuaIkOWKn+OAguWImeavj+asoeaOt+mqsOeahOaIkOWKn+eOh+aYrzEvNuOAguimgeaOt+WHuuS4ieasoeS4gO+8jOaJgOmcgOeahOaOt+mqsOasoeaVsOWxnuS6jumbhuWQiCB7IDMsIDQsIDUsIDYsIC4uLiB9IOOAgg0KDQrmjrfliLDkuInmrKHkuIDnmoTmjrfpqrDmrKHmlbDmmK/otJ/kuozpobnliIbluIPnmoTpmo/mnLrlj5jph4/jgIINCg0KZG5iaW5vbSg0LDMsMS82KT0wLjAzMzQ4OTjvvIzlm5vmrKHov57nu63kuInmrKEx55qE5qaC546H5Li66L+Z5Liq5pWw44CCDQrmpoLnjoflh73mlbDkuLpmKGs7cixwKT1jaG9vc2UoaytyLTEsci0xKSpwXnIqKDEtcCleaywg5b2Tcj0x5pe26L+Z5Liq54m55L6L5YiG5biD5piv5Yeg5L2V5YiG5biDDQoNCnJuYmlub20obixzaXplLHByb2IsbXUpIOWFtuS4rW7mmK/pnIDopoHkuqfnlJ/nmoTpmo/mnLrmlbDkuKrmlbDvvIxzaXpl5piv5qaC546H5Ye95pWw5Lit55qEcu+8jOWNs+i/nue7reaIkOWKn+eahOasoeaVsO+8jHByb2LmmK/ljZXor43miJDlip/nmoTmpoLnjofvvIxtdeacquefpS4uKG115piv5biM6IWK5a2X5q+Nz4XnmoTor7vpn7MpDQogDQojIyMgMy7lh6DkvZXliIbluINHZW9tZXRyaWMgRGlzdHJpYnV0aW9uLGdlb20NCg0KbuasoeS8r+WKquWIqeivlemqjO+8jOWJjW4tMeasoeeahuWksei0pe+8jOesrG7mrKHmiY3miJDlip/nmoTmnLrnjocNCg0KZGdlb20oeCxwcm9iKSzms6jmhI/ov5nph4znmoR45Y+W5YC85pivMDpu77yM5Y2zZGdlb20oMCwwLjIpPTAuMizku6XkuIrnmoTkuozpobnliIbluIPlkozotJ/kuozpobnliIbluIPkuZ/mmK/lpoLmraTjgIINCg0Kbmdlb20obixwcm9iKQ0KIA0KIyMjIDQu6LaF5Yeg5L2V5YiG5biDSHlwZXJnZW9tZXRyaWMgRGlzdHJpYnV0aW9u77yMaHlwZXINCg0K5a6D5o+P6L+w5LqG55Sx5pyJ6ZmQ5LiqKG0rbinnianku7bkuK3mir3lh7pr5Liq54mp5Lu277yM5oiQ5Yqf5oq95Ye65oyH5a6a56eN57G755qE54mp5Lu255qE5qyh5pWw77yI5LiN5b2S6L+Y77yJ44CCDQrmpoLnjofvvJpwKHgpID0gY2hvb3NlKG0sIHgpIGNob29zZShuLCBrLXgpIC8gY2hvb3NlKG0rbiwgaykgZm9yIHggPSAwLCAuLi4sIGsuIA0K5b2Tbj0x5pe277yM6L+Z5piv5LiA5LiqMC0x5YiG5biD5Y2z5Lyv5Yqq5Yip5YiG5biD77yM5b2TbuaOpei/keaXoOept+Wkp+KInuaXtu+8jOi2heWHoOS9leWIhuW4g+WPr+inhuS4uuS6jOmhueWIhuW4gw0Kcmh5cGVyKG5uLG0sbixrKSxubuaYr+mcgOimgeS6p+eUn+eahOmaj+acuuaVsOS4quaVsO+8jG3mmK/nmb3nkIPmlbDvvIjorqHnrpfnm67moIfmmK/lj5bliLB45Liq55m955CD55qE5qaC546H77yJ77yMbuaYr+m7keeQg+aVsO+8jGvmmK/mir3lj5blh7rnmoTnkIPkuKrmlbANCmRoeXBlcih4LCBtLCBuLCBrKQ0KIA0KIyMjIDUu5rOK5p2+5YiG5biDIFBvaXNzb24gRGlzdHJpYnV0aW9uLHBvaXMNCiANCnAoeCkgPSBsYW1iZGFeeCBleHAoLWxhbWJkYSkveCENCmZvciB4ID0gMCwgMSwgMiwgLi4uLiBUaGUgbWVhbiBhbmQgdmFyaWFuY2UgYXJlIEUoWCkgPSBWYXIoWCkgPSDOuy4gIHggfiDPgCjOuykNCuaziuadvuWIhuW4g+eahOWPguaVsM675piv5Y2V5L2N5pe26Ze0KOaIluWNleS9jemdouenrynlhoXpmo/mnLrkuovku7bnmoTlubPlnYflj5HnlJ/njocu5rOK5p2+5YiG5biD6YCC5ZCI5LqO5o+P6L+w5Y2V5L2N5pe26Ze05YaF6ZqP5py65LqL5Lu25Y+R55Sf55qE5qyh5pWw44CC5aaC5p+Q5LiA5pyN5Yqh6K6+5pa95Zyo5LiA5a6a5pe26Ze05YaF5Yiw6L6+55qE5Lq65pWw77yM55S16K+d5Lqk5o2i5py65o6l5Yiw5ZG85Y+r55qE5qyh5pWw77yM5rG96L2m56uZ5Y+w55qE5YCZ5a6i5Lq65pWw77yM5py65Zmo5Ye6546w55qE5pWF6Zqc5pWw77yM6Ieq54S254G+5a6z5Y+R55Sf55qE5qyh5pWw562J562JLg0KcnBvaXMobiwgbGFtYmRhKQ0KZHBvaXMoeCxsYW1iZGEpDQogDQojIyAwMi4g6L+e57ut5Z6LDQogDQojIyMgNi7lnYfljIDliIbluIMgVW5pZm9ybSBEaXN0cmlidXRpb27vvIx1bmlmDQoNCuWdh+WMgOWIhuW4gyhVbmlmb3JtIGRpc3RyaWJ1dGlvbinmmK/lnYfljIDnmoTvvIzkuI3lgY/lt67nmoTkuIDnp43nroDljZXnmoTmpoLnjofliIbluIPvvIzliIbkuLrvvJrnprvmlaPlnovlnYfljIDliIbluIPkuI7ov57nu63lnovlnYfljIDliIbluIPjgIINCg0KZih4KSA9IDEvKG1heC1taW4pIGZvciBtaW4gPD0geCA8PSBtYXguIA0KcnVuaWYobixtaW4sbWF4KS4NCueUn+aIkDE25L2N5pWw55qE6ZqP5py65pWw77yaYXMuY2hhcmFjdGVyKHJ1bmlmKDEsMTAwMDAwMDAwMDAwMDAwMCw5OTk5OTk5OTk5OTk5OTk5KSkNCmR1bmlmKHgsbWluLG1heCk9MSzmgZLlrprnrYnkuo4xLyhtYXgtbWluKS4NCuWvueS6jui/nue7reWPmOmHj++8jGRmdW5jdGlvbueahOWAvOaYr3jljrvnibnlrprlgLzku6PlhaXmpoLnjoflr4bluqblh73mlbDlvpfliLDnmoTlh73mlbDlgLzjgIINCg0KIyMjIyA2LjEg5Z2H5YyA5YiG5biDLeamgueOh+WvhuW6puWHveaVsA0KYGBge3IgVW5pZm9ybSBEaXN0cmlidXRpb259DQpzZXQuc2VlZCgxKQ0KeDwtc2VxKDAsMTAsbGVuZ3RoLm91dD0xMDAwKQ0KeTwtZHVuaWYoeCwwLDEpDQoNCnBsb3QoeCx5LGNvbD0icmVkIix4bGltPWMoMCwxMCkseWxpbT1jKDAsMS4yKSx0eXBlPSdsJywNCiAgICAgeGF4cz0iaSIsIHlheHM9ImkiLHlsYWI9J2RlbnNpdHknLHhsYWI9JycsDQogICAgIG1haW49IlRoZSBVbmlmb3JtIERlbnNpdHkgRGlzdHJpYnV0aW9uIikNCmxpbmVzKHgsZG5vcm0oeCwwLDAuNSksY29sPSJncmVlbiIpDQpsaW5lcyh4LGRub3JtKHgsMCwyKSxjb2w9ImJsdWUiKQ0KbGluZXMoeCxkbm9ybSh4LC0yLDEpLGNvbD0ib3JhbmdlIikNCmxpbmVzKHgsZG5vcm0oeCw0LDIpLGNvbD0icHVycGxlIikNCg0KbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kPXBhc3RlKCJtPSIsYygwLDAsMCwtMiw0KSwiIHNkPSIsIGMoMSwwLjUsMiwxLDIpKSwgbHdkPTEsIGNvbD1jKCJyZWQiLCAiZ3JlZW4iLCJibHVlIiwib3JhbmdlIiwicHVycGxlIikpDQpgYGANCg0KIyMjIyA2LjIg5Z2H5YyA5YiG5biDLee0r+enr+WIhuW4g+WHveaVsA0KDQpmKHgpID0gMCBmb3IgeCA8IGENCmYoeCkgPSAoeC1hKS8oYi1hKSBmb3IgYTw9IHggPD0gYg0KZih4KSA9IDEgZm9yIHggPj0gYg0KDQpgYGB7ciBVbmlmb3JtIEN1bXVsYXRpdmUgRGlzdHJpYnV0aW9uIEZ1bmN0aW9ufQ0Kc2V0LnNlZWQoMSkNCng8LXNlcSgwLDEwLGxlbmd0aC5vdXQ9MTAwMCkNCnk8LXB1bmlmKHgsMCwxKQ0KDQpwbG90KHgseSxjb2w9InJlZCIseGxpbT1jKDAsMTApLHlsaW09YygwLDEuMiksdHlwZT0nbCcsDQogICAgIHhheHM9ImkiLCB5YXhzPSJpIix5bGFiPSdkZW5zaXR5Jyx4bGFiPScnLA0KICAgICBtYWluPSJUaGUgVW5pZm9ybSBDdW11bGF0aXZlIERpc3RyaWJ1dGlvbiBGdW5jdGlvbiIpDQoNCmxpbmVzKHgscHVuaWYoeCwwLDAuNSksY29sPSJncmVlbiIpDQpsaW5lcyh4LHB1bmlmKHgsMCwyKSxjb2w9ImJsdWUiKQ0KbGluZXMoeCxwdW5pZih4LC0yLDEpLGNvbD0ib3JhbmdlIikNCg0KbGVnZW5kKCJib3R0b21yaWdodCIsbGVnZW5kPXBhc3RlKCJtPSIsYygwLDAsMCwtMiksIiBzZD0iLCBjKDEsMC41LDIsMSkpLCBsd2Q9MSwgY29sPWMoInJlZCIsICJncmVlbiIsImJsdWUiLCJvcmFuZ2UiLCJwdXJwbGUiKSkNCmBgYA0KDQojIyMjIDYuMyDlnYfljIDliIbluIMt5YiG5biD5qOA6aqMDQoNCktvbG1vZ29yb3YtU21pcm5vdui/nue7reWIhuW4g+ajgOmqjDog5qOA6aqM5Y2V5LiA5qC35pys5piv5LiN5piv5pyN5LuO5p+Q5LiA6aKE5YWI5YGH6K6+55qE54m55a6a5YiG5biD55qE5pa55rOV44CC5Lul5qC35pys5pWw5o2u55qE57Sv6K6h6aKR5pWw5YiG5biD5LiO54m55a6a55CG6K665YiG5biD5q+U6L6D77yM6Iul5Lik6ICF6Ze055qE5beu6Led5b6I5bCP77yM5YiZ5o6o6K666K+l5qC35pys5Y+W6Ieq5p+Q54m55a6a5YiG5biD5peP44CCDQoNCuivpeajgOmqjOWOn+WBh+iuvuS4ukgwOuaVsOaNrumbhuespuWQiOWdh+WMgOWIhuW4g++8jEgxOuagt+acrOaJgOadpeiHqueahOaAu+S9k+WIhuW4g+S4jeespuWQiOWdh+WMgOWIhuW4g+OAguS7pEYwKHgp6KGo56S66aKE5YWI5YGH6K6+55qE55CG6K665YiG5biD77yMRm4oeCnooajnpLrpmo/mnLrmoLfmnKznmoTntK/orqHmpoLnjoco6aKR546HKeWHveaVsC4NCg0K57uf6K6h6YePROS4ujogRD1tYXh8RjAoeCkgLSBGbih4KXwNCg0KROWAvOi2iuWwj++8jOi2iuaOpei/kTDvvIzooajnpLrmoLfmnKzmlbDmja7otormjqXov5HlnYfljIDliIbluIMNCnDlgLzvvIzlpoLmnpxwLXZhbHVl5bCP5LqO5pi+6JGX5oCn5rC05bmzzrEoMC4wNSnvvIzliJnmi5Lnu51IMA0KDQpgYGB7ciBLb2xtb2dvcm92LVNtaXJub3YgdGVzdCBVbmlmb3JtIEN1bXVsYXRpdmUgRGlzdHJpYnV0aW9ufQ0Kc2V0LnNlZWQoMSkNClM8LXJ1bmlmKDEwMDApDQprcy50ZXN0KFMsICJwdW5pZiIpDQojIAlPbmUtc2FtcGxlIEtvbG1vZ29yb3YtU21pcm5vdiB0ZXN0DQojIGRhdGE6ICBTDQojIEQgPSAwLjAyNDQsIHAtdmFsdWUgPSAwLjU5MjgNCiMgYWx0ZXJuYXRpdmUgaHlwb3RoZXNpczogdHdvLXNpZGVkDQpgYGANCue7k+iuujogROWAvOW+iOWwjywgcC12YWx1ZT4wLjA177yM5LiN6IO95ouS57ud5Y6f5YGH6K6+77yM5omA5Lul5pWw5o2u6ZuGU+espuWQiOWdh+WMgOWIhuW4g++8gQ0KDQogDQojIyMgNy7mraPmgIHliIbluINOb3JtYWwgRGlzdHJpYnV0aW9u77yMbm9ybQ0KDQrmraPmgIHliIbluIMoTm9ybWFsIGRpc3RyaWJ1dGlvbinlj4jlkI3pq5jmlq/liIbluIMoR2F1c3NpYW4gZGlzdHJpYnV0aW9uKe+8jOaYr+S4gOS4quWcqOaVsOWtpuOAgeeJqeeQhuWPiuW3peeoi+etiemihuWfn+mDvemdnuW4uOmHjeimgeeahOamgueOh+WIhuW4g++8jOWcqOe7n+iuoeWtpueahOiuuOWkmuaWuemdouacieedgOmHjeWkp+eahOW9seWTjeWKm+OAgg0KDQroi6Xpmo/mnLrlj5jph49Y5pyN5LuO5LiA5Liq5pWw5a2m5pyf5pyb5Li6zrzjgIHmlrnlt67kuLrPg14y55qE5q2j5oCB5YiG5biD77yM6K6w5Li6TijOvO+8jM+DXjIp44CC5YW25qaC546H5a+G5bqm5Ye95pWw5Li65q2j5oCB5YiG5biD55qE5pyf5pyb5YC8zrzlhrPlrprkuoblhbbkvY3nva7vvIzlhbbmoIflh4blt67Pg+WGs+WumuS6huWIhuW4g+eahOW5heW6puOAguWboOWFtuabsue6v+WRiOmSn+W9ou+8jOWboOatpOS6uuS7rOWPiOe7j+W4uOensOS5i+S4uumSn+W9ouabsue6v+OAguaIkeS7rOmAmuW4uOaJgOivtOeahOagh+WHhuato+aAgeWIhuW4g+aYr868ID0gMCzPgyA9IDHnmoTmraPmgIHliIbluIPjgIINCg0KIyMjIyA3LjEg5q2j5oCB5YiG5biD5qaC546H5a+G5bqm5Ye95pWwDQpgZih4KSA9IDEvKHNxcnQoMipwaSkqc2lnbWEpICogZV4tKCh4IC0gbXUpXjIvKDIqc2lnbWFeMikpYA0KDQrlhbbkuK1tdeaYr+Wdh+WAvO+8jHNpZ21h5pivc3RhbmRhcmQgZGV2aWF0aW9u5qCH5YeG5beuDQrnkIborrrkuIrlj6/ku6Xor4HmmI7lpoLmnpzmiororrjlpJrlsI/kvZznlKjliqDotbfmnaXnnIvlgZrkuIDkuKrlj5jph48s6YKj5LmI6L+Z5Liq5Y+Y6YeP5pyN5LuO5q2j5oCB5YiG5biDDQpybm9ybShuLG1lYW49MCxzZD0xKeWQjuS4pOS4quWPguaVsOWmguaenOS4jeWhq+WImem7mOiupOS4ujAsMeOAgg0KZG5vcm0oeCxtZWFuLHNkKSxzZOaYr+agh+WHhuW3ruOAgg0K55S75Ye65q2j5oCB5YiG5biD5qaC546H5a+G5bqm5Ye95pWw55qE5aSn6Ie05Zu+5b2i77yaDQp4PC1zZXEoLTMsMywwLjEpDQpwbG90KHgsZG5vcm0oeCkpDQpwbG905Lit55qEeCx56KaB5pyJ55u45YWz5YWz57O75omN5Lya5b2i5oiQ5Ye95pWw5Zu+44CCDQpxbm9ybShwLG1lYW4sc2QpLOi/meS4qui/mOaYr+S4iuS+p+WIhuS9jeaVsO+8jOWmgnFub3JtKDAuMDUpPS0xLjY0NDg1NCzljbN4PD3ov5nkuKrmlbDnmoTntK/orqHmpoLnjoflsI/kuo4wLjA1DQogDQozc2lnbWHms5XliJnvvJrlr7nkuo7mraPmgIHliIbluIPnmoR477yMeOWPluWAvOWcqChtZWFuLTNzZCxtZWFuKzNzZCnlh6DkuY7mmK/lnKjogq/lrprnmoTjgIINCuWboOS4unBub3JtKDMpLXBub3JtKC0zKT0wLjk5NzMwMDINCiANCueUqOato+aAgeWIhuW4g+S6p+eUn+S4gOS4qjE25L2N6ZW/55qE6ZqP5py65pWw5a2X77yaDQphcy5jaGFyYWN0ZXIoMTBeMTYqcm5vcm0oMSkpDQoNCmBgYHtyIE5vcm1hbCBEaXN0cmlidXRpb259DQpzZXQuc2VlZCgxKQ0KeCA8LSBzZXEoLTUsNSxsZW5ndGgub3V0PTEwMCkNCnkgPC0gZG5vcm0oeCwwLDEpDQogIA0KcGxvdCh4LHksY29sPSJyZWQiLHhsaW09YygtNSw1KSx5bGltPWMoMCwxKSx0eXBlPSdsJywNCiAgICAgeGF4cz0iaSIsIHlheHM9ImkiLHlsYWI9J2RlbnNpdHknLHhsYWI9JycsDQogICAgIG1haW49IlRoZSBOb3JtYWwgRGVuc2l0eSBEaXN0cmlidXRpb24iKQ0KDQpsaW5lcyh4LGRub3JtKHgsMCwwLjUpLGNvbD0iZ3JlZW4iKQ0KbGluZXMoeCxkbm9ybSh4LDAsMiksY29sPSJibHVlIikNCmxpbmVzKHgsZG5vcm0oeCwtMiwxKSxjb2w9Im9yYW5nZSIpDQoNCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZD1wYXN0ZSgibT0iLGMoMCwwLDAsLTIpLCIgc2Q9IiwgYygxLDAuNSwyLDEpKSwgbHdkPTEsIGNvbD1jKCJyZWQiLCAiZ3JlZW4iLCJibHVlIiwib3JhbmdlIikpDQpgYGANCg0KIyMjIyA3LjIg5q2j5oCB5YiG5biD57Sv56ev5YiG5biD5Ye95pWwDQoNCkN1bXVsYXRpdmUgRGlzdHJpYnV0aW9uDQoNCuenr+WIhuWHveaVsCBpbnRlZ3JhdGUoZixsb3dlcix1cHBlcikNCg0KYGYoeCxtdSxzaWdtYSkgPSAxLyhzcXJ0KDIqcGkpKnNpZ21hKSAqIGludGVncmF0ZShlXi0oKHggLSBtdSleMi8oMipzaWdtYV4yKSksLUluZiwgeClgDQoNCmBgYHtyIEN1bXVsYXRpdmUgRGlzdHJpYnV0aW9ufQ0Kc2V0LnNlZWQoMSkNCnggPC0gc2VxKC01LDUsbGVuZ3RoLm91dD0xMDApDQp5IDwtIHBub3JtKHgsMCwxKQ0KDQpwbG90KHgseSxjb2w9InJlZCIseGxpbT1jKC01LDUpLHlsaW09YygwLDEpLHR5cGU9J2wnLA0KICAgICB4YXhzPSJpIiwgeWF4cz0iaSIseWxhYj0nZGVuc2l0eScseGxhYj0nJywNCiAgICAgbWFpbj0iVGhlIE5vcm1hbCBDdW11bGF0aXZlIERpc3RyaWJ1dGlvbiIpDQoNCmxpbmVzKHgscG5vcm0oeCwwLDAuNSksY29sPSJncmVlbiIpDQpsaW5lcyh4LHBub3JtKHgsMCwyKSxjb2w9ImJsdWUiKQ0KbGluZXMoeCxwbm9ybSh4LC0yLDEpLGNvbD0ib3JhbmdlIikNCg0KbGVnZW5kKCJib3R0b21yaWdodCIsbGVnZW5kPXBhc3RlKCJtPSIsYygwLDAsMCwtMiksIiBzZD0iLCBjKDEsMC41LDIsMSkpLCBsd2Q9MSxjb2w9YygicmVkIiwgImdyZWVuIiwiYmx1ZSIsIm9yYW5nZSIpKQ0KYGBgDQoNCiMjIyMgNy4zIOato+aAgeWIhuW4g+e0r+enr+WIhuW4g+ajgOmqjA0KDQpTaGFwaXJvLVdpbGvmraPmgIHliIbluIPmo4Dpqow6IOeUqOadpeajgOmqjOaYr+WQpuaVsOaNruespuWQiOato+aAgeWIhuW4g++8jOexu+S8vOS6jue6v+aAp+WbnuW9kueahOaWueazleS4gOagt++8jOaYr+ajgOmqjOWFtuS6juWbnuW9kuabsue6v+eahOaui+W3ruOAguivpeaWueazleaOqOiNkOWcqOagt+acrOmHj+W+iOWwj+eahOaXtuWAmeS9v+eUqO+8jOagt+acrOWcqDPliLA1MDAw5LmL6Ze044CCDQoNCuivpeajgOmqjOWOn+WBh+iuvuS4ukgwOuaVsOaNrumbhuespuWQiOato+aAgeWIhuW4g++8jOe7n+iuoemHj1fkuLrvvJoNCmBXID0gKGN1bXN1bShhX2kqeF9pKSleMi8oY3Vtc3VtKHhfaSptZWFuKHgpKSleMmANCmkgZnJvbSAxIHRvIG4NCg0K57uf6K6h6YePVyDmnIDlpKflgLzmmK8x77yM6LaK5o6l6L+RMe+8jOihqOekuuagt+acrOS4juato+aAgeWIhuW4g+WMuemFjQ0KcOWAvO+8jOWmguaenHAtdmFsdWXlsI/kuo7mmL7okZfmgKfmsLTlubPOsSgwLjA1Ke+8jOWImeaLkue7nUgwDQoNCmBgYHtyfQ0Kc2V0LnNlZWQoMSkNClM8LXJub3JtKDEwMDApDQpzaGFwaXJvLnRlc3QoUykNCiMgCVNoYXBpcm8tV2lsayBub3JtYWxpdHkgdGVzdA0KIyBkYXRhOiAgUw0KIyBXID0gMC45OTg4LCBwLXZhbHVlID0gMC43MjU2DQpgYGANCue7k+iuujogV+aOpei/kTHvvIxwLXZhbHVlPjAuMDXvvIzkuI3og73mi5Lnu53ljp/lgYforr7vvIzmiYDku6XmlbDmja7pm4ZT56ym5ZCI5q2j5oCB5YiG5biD77yBDQoNCiMjIyMgNy40IEtvbG1vZ29yb3YtU21pcm5vdui/nue7reWIhuW4g+ajgOmqjA0KDQrmo4DpqozljZXkuIDmoLfmnKzmmK/kuI3mmK/mnI3ku47mn5DkuIDpooTlhYjlgYforr7nmoTnibnlrprliIbluIPnmoTmlrnms5XjgILku6XmoLfmnKzmlbDmja7nmoTntK/orqHpopHmlbDliIbluIPkuI7nibnlrprnkIborrrliIbluIPmr5TovoPvvIzoi6XkuKTogIXpl7TnmoTlt67ot53lvojlsI/vvIzliJnmjqjorrror6XmoLfmnKzlj5boh6rmn5DnibnlrprliIbluIPml4/jgIINCg0K6K+l5qOA6aqM5Y6f5YGH6K6+5Li6SDA65pWw5o2u6ZuG56ym5ZCI5q2j5oCB5YiG5biD77yMDQpIMTrmoLfmnKzmiYDmnaXoh6rnmoTmgLvkvZPliIbluIPkuI3nrKblkIjmraPmgIHliIbluIPjgIINCuS7pEYwKHgp6KGo56S66aKE5YWI5YGH6K6+55qE55CG6K665YiG5biD77yMRm4oeCnooajnpLrpmo/mnLrmoLfmnKznmoTntK/orqHmpoLnjoco6aKR546HKeWHveaVsC4NCg0K57uf6K6h6YePROS4ujogRD1tYXh8RjAoeCkgLSBGbih4KXwNCg0KROWAvOi2iuWwj++8jOi2iuaOpei/kTDvvIzooajnpLrmoLfmnKzmlbDmja7otormjqXov5HmraPmgIHliIbluIMNCnDlgLzvvIzlpoLmnpxwLXZhbHVl5bCP5LqO5pi+6JGX5oCn5rC05bmzzrEoMC4wNSnvvIzliJnmi5Lnu51IMA0KYGBge3IgS29sbW9nb3Jvdi1TbWlybm92IHRlc3QgZXgyfQ0Kc2V0LnNlZWQoMSkNClM8LXJub3JtKDEwMDApDQprcy50ZXN0KFMsICJwbm9ybSIpDQojIAlPbmUtc2FtcGxlIEtvbG1vZ29yb3YtU21pcm5vdiB0ZXN0DQojIGRhdGE6ICBTDQojIEQgPSAwLjAyMTEsIHAtdmFsdWUgPSAwLjc2NzMNCiMgYWx0ZXJuYXRpdmUgaHlwb3RoZXNpczogdHdvLXNpZGVkDQpgYGANCue7k+iuujogROWAvOW+iOWwjywgcC12YWx1ZT4wLjA177yM5LiN6IO95ouS57ud5Y6f5YGH6K6+77yM5omA5Lul5pWw5o2u6ZuGU+espuWQiOato+aAgeWIhuW4g++8gQ0KDQoNCiMjIyA4LuS8veeOm+WIhuW4g0dhbW1hIERpc3RyaWJ1dGlvbu+8jGdhbW1hDQoNCijkvL3njpvliIbluIMpW2h0dHA6Ly96aC53aWtpcGVkaWEub3JnL3cvaW5kZXguUEhQP3RpdGxlPeS8veeOm+WIhuW4gyZ2YXJpYW50PXpoLWNuXQ0KDQrkvL3njpvliIbluIMoR2FtbWEp5piv6JGX5ZCN55qE55qu5bCU6YCK5qaC546H5YiG5biD5Ye95pWw57CH5Lit55qE6YeN6KaB5LiA5ZGY77yM56ew5Li655qu5bCU6YCK4oWi5Z6L5YiG5biD44CC5a6D55qE5puy57q/5pyJ5LiA5Liq5bOw77yM5L2G5bem5Y+z5LiN5a+556ew44CCDQoNCuS8veeOm+WIhuW4g+S4reeahOWPguaVsM6x77yM56ew5Li65b2i54q25Y+C5pWw77yMzrLnp7DkuLrlsLrluqblj4LmlbDjgIINCg0K5YGH6K6+6ZqP5py65Y+Y6YePWOS4uiDnrYnliLDnrKzOseS7tuS6i+WPkeeUn+aJgOmcgOS5i+etieWAmeaXtumXtOOAgg0KDQojIyMjIDguMSDkvL3njpvliIbluIPmpoLnjoflr4bluqblh73mlbANCg0KYGYoeCk9IDEvKM6yXs6xICogR2FtbWEozrEpKSAqIHheKM6xLTEpICogZV4tKHgvzrIpYA0KZm9yIHggPj0gMCwgzrEgPiAwIGFuZCDOsiA+IDANCg0K5Ly9546b5Ye95pWw5Li6DQpHYW1tYSjOsSkgPSBpbnRlZ3JhdGUodF4ozrEtMSkqZV4oLXQpLCAwLCBJbmYpDQrkvL3njpvlh73mlbDmmK/pmLbkuZjlnKjlrp7mlbDkuIrnmoTms5vljJbjgIINCg0KR2FtbWHliIbluIPkuK3nmoTlj4LmlbDOse+8jOensOS4uuW9oueKtuWPguaVsO+8iHNoYXBlIHBhcmFtZXRlcu+8ie+8jOWNs+S4iuW8j+S4reeahM6x77yMzrLnp7DkuLrlsLrluqblj4LmlbDvvIhzY2FsZSBwYXJhbWV0ZXLvvInkuIrlvI/kuK3nmoTOsg0KRSh4KT1zKs6xLCBWYXIoeCk9zrIqzrFeMi4NCuW9k3NoYXBlPTEvMixzY2FsZT0y5pe277yM6L+Z5qC355qEZ2FtbWHliIbluIPmmK/oh6rnlLHluqbkuLox55qE5byA5pa55YiG5biDDQogDQpodHRwOi8vemgud2lraXBlZGlhLm9yZy93aWtpL0ZpbGU6R2FtbWFfZGlzdHJpYnV0aW9uX3BkZi5wbmcNCiANCmRnYW1tYSh4LHNoYXBlLHJhdGU9MSxzY2FsZT0xL3JhdGUpLCDor7fms6jmhI9S5Zyo6L+Z6YeM5o+Q5L6b55qEcmF0ZeaYr3NjYWxl5bC65bqm5Y+C5pWw55qE5YCS5pWw77yM5aaC5p6cZGdhbW1hKDAsMSwyKeWImeihqOekumRnYW1tYSgwLHNoYXBlPTEscmF0ZT0yKSzogIzpnZ5kZ2FtbWEoMCxzaGFwZT0xLHNjYWxlPTIpDQpwZ2FtbWEocSwgc2hhcGUsIHJhdGUgPSAxLCBzY2FsZSA9IDEvcmF0ZSwgbG93ZXIudGFpbCA9IFRSVUUsDQogICAgICAgbG9nLnAgPSBGQUxTRSkNCiAgICAgICANCnFnYW1tYShwLCBzaGFwZSwgcmF0ZSA9IDEsIHNjYWxlID0gMS9yYXRlLCBsb3dlci50YWlsID0gVFJVRSwNCiAgICAgICBsb2cucCA9IEZBTFNFKQ0KICAgICAgIA0KcmdhbW1hKG4sIHNoYXBlLCByYXRlID0gMSwgc2NhbGUgPSAxL3JhdGUpDQoNCmBgYHtyIEdhbW1hIERlbnNpdHkgRGlzdHJpYnV0aW9ufQ0Kc2V0LnNlZWQoMSkNCng8LXNlcSgwLDEwLGxlbmd0aC5vdXQ9MTAwKQ0KeTwtZGdhbW1hKHgsMSwyKQ0KDQpwbG90KHgseSxjb2w9InJlZCIseGxpbT1jKDAsMTApLHlsaW09YygwLDIpLHR5cGU9J2wnLA0KICAgICB4YXhzPSJpIiwgeWF4cz0iaSIseWxhYj0nZGVuc2l0eScseGxhYj0nJywNCiAgICAgbWFpbj0iVGhlIEdhbW1hIERlbnNpdHkgRGlzdHJpYnV0aW9uIikNCg0KbGluZXMoeCxkZ2FtbWEoeCwyLDIpLGNvbD0iZ3JlZW4iKQ0KbGluZXMoeCxkZ2FtbWEoeCwzLDIpLGNvbD0iYmx1ZSIpDQpsaW5lcyh4LGRnYW1tYSh4LDUsMSksY29sPSJvcmFuZ2UiKQ0KbGluZXMoeCxkZ2FtbWEoeCw5LDEpLGNvbD0iYmxhY2siKQ0KDQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQ9cGFzdGUoInNoYXBlPSIsYygxLDIsMyw1LDkpLCIgcmF0ZT0iLCBjKDIsMiwyLDEsMSkpLCBsd2Q9MSwgY29sPWMoInJlZCIsICJncmVlbiIsImJsdWUiLCJvcmFuZ2UiLCJibGFjayIpKQ0KYGBgDQoNCiMjIyMgOC4yICDkvL3njpvliIbluIPntK/np6/liIbluIPlh73mlbANCg0KZih4KSA9IM6zKGssIHgvzrgpL0dhbW1hKGspDQoNCiMjIyMgOC4zICDkvL3njpvliIbluIMt5YiG5biD5qOA6aqMDQoNCktvbG1vZ29yb3YtU21pcm5vdui/nue7reWIhuW4g+ajgOmqjDog5qOA6aqM5Y2V5LiA5qC35pys5piv5LiN5piv5pyN5LuO5p+Q5LiA6aKE5YWI5YGH6K6+55qE54m55a6a5YiG5biD55qE5pa55rOV44CC5Lul5qC35pys5pWw5o2u55qE57Sv6K6h6aKR5pWw5YiG5biD5LiO54m55a6a55CG6K665YiG5biD5q+U6L6D77yM6Iul5Lik6ICF6Ze055qE5beu6Led5b6I5bCP77yM5YiZ5o6o6K666K+l5qC35pys5Y+W6Ieq5p+Q54m55a6a5YiG5biD5peP44CCDQoNCuivpeajgOmqjOWOn+WBh+iuvuS4ukgwOuaVsOaNrumbhuespuWQiOS8veeOm+WIhuW4g++8jEgxOuagt+acrOaJgOadpeiHqueahOaAu+S9k+WIhuW4g+S4jeespuWQiOS8veeOm+WIhuW4g+OAguS7pEYwKHgp6KGo56S66aKE5YWI5YGH6K6+55qE55CG6K665YiG5biD77yMRm4oeCnooajnpLrpmo/mnLrmoLfmnKznmoTntK/orqHmpoLnjoco6aKR546HKeWHveaVsC4NCg0K57uf6K6h6YePROS4ujogYEQ9bWF4fEYwKHgpIC0gRm4oeCl8YA0KDQpE5YC86LaK5bCP77yM6LaK5o6l6L+RMO+8jOihqOekuuagt+acrOaVsOaNrui2iuaOpei/keS8veeOm+WIhuW4gw0KcOWAvO+8jOWmguaenHAtdmFsdWXlsI/kuo7mmL7okZfmgKfmsLTlubPOsSgwLjA1Ke+8jOWImeaLkue7nUgwDQoNCmBgYHtyIEtvbG1vZ29yb3YtU21pcm5vdiB0ZXN0IGdhbW1hfQ0Kc2V0LnNlZWQoMSkNClM8LXJnYW1tYSgxMDAwLDEpDQprcy50ZXN0KFMsICJwZ2FtbWEiLCAxKQ0KIyAJT25lLXNhbXBsZSBLb2xtb2dvcm92LVNtaXJub3YgdGVzdA0KIyBkYXRhOiAgUw0KIyBEID0gMC4wMzYzLCBwLXZhbHVlID0gMC4xNDM4DQojIGFsdGVybmF0aXZlIGh5cG90aGVzaXM6IHR3by1zaWRlZA0KYGBgDQoNCue7k+iuujogROWAvOW+iOWwjywgcC12YWx1ZT4wLjA177yM5LiN6IO95ouS57ud5Y6f5YGH6K6+77yM5omA5Lul5pWw5o2u6ZuGU+espuWQiHNoYXBlPTHkvL3njpvliIbluIPvvIENCg0K5qOA6aqM5aSx6LSl77yaDQpgYGB7ciBLb2xtb2dvcm92LVNtaXJub3YgdGVzdCBnYW1tYTJ9DQprcy50ZXN0KFMsICJwZ2FtbWEiLCAyKQ0KIyAJT25lLXNhbXBsZSBLb2xtb2dvcm92LVNtaXJub3YgdGVzdA0KIyBkYXRhOiAgUw0KIyBEID0gMC4zODAxLCBwLXZhbHVlIDwgMi4yZS0xNg0KIyBhbHRlcm5hdGl2ZSBoeXBvdGhlc2lzOiB0d28tc2lkZWQNCmBgYA0K57uT6K66OkTlgLzkuI3lpJ/lsI8sIHAtdmFsdWU8MC4wNe+8jOaLkue7neWOn+WBh+iuvu+8jOaJgOS7peaVsOaNrumbhlPnrKblkIhzaGFwZT0y5Ly9546b5YiG5biD77yBDQoNCg0KIA0KIyMjIDku5oyH5pWw5YiG5biDRXhwb25lbnRpYWwgRGlzdHJpYnV0aW9u77yMZXhwDQoNCuaMh+aVsOWIhuW4gyhFeHBvbmVudGlhbCBkaXN0cmlidXRpb24p55So5p2l6KGo56S654us56uL6ZqP5py65LqL5Lu25Y+R55Sf55qE5pe26Ze06Ze06ZqU77yM5q+U5aaC5peF5a6i6L+b5py65Zy655qE5pe26Ze06Ze06ZqU44CB5Lit5paH57u05Z+655m+56eR5paw5p2h55uu5Ye6546w55qE5pe26Ze06Ze06ZqU562J562J44CCDQoNCuiuuOWkmueUteWtkOS6p+WTgeeahOWvv+WRveWIhuW4g+S4gOiIrOacjeS7juaMh+aVsOWIhuW4g+OAguacieeahOezu+e7n+eahOWvv+WRveWIhuW4g+S5n+WPr+eUqOaMh+aVsOWIhuW4g+adpei/keS8vOOAguWug+WcqOWPr+mdoOaAp+eglOeptuS4reaYr+acgOW4uOeUqOeahOS4gOenjeWIhuW4g+W9ouW8j+OAguaMh+aVsOWIhuW4g+aYr+S8veeOm+WIhuW4g+WSjHdlaWJ1bGzliIbluIPnmoTnibnmrormg4XlhrXvvIzkuqflk4HnmoTlpLHmlYjmmK/lgbbnhLblpLHmlYjml7bvvIzlhbblr7/lkb3mnI3ku47mjIfmlbDliIbluIPjgIINCg0K5oyH5pWw5YiG5biD5Y+v5Lul55yL5L2c5b2Td2VpYnVsbOWIhuW4g+S4reeahOW9oueKtuezu+aVsOetieS6jjHnmoTnibnmrorliIbluIPvvIzmjIfmlbDliIbluIPnmoTlpLHmlYjnjofmmK/kuI7ml7bpl7R05peg5YWz55qE5bi45pWw77yM5omA5Lul5YiG5biD5Ye95pWw566A5Y2V44CC6K6w5L2cWCB+IEV4cG9uZW50aWFsKM67KeOAgg0KDQojIyMjIDkuMSDmjIfmlbDliIbluIPmpoLnjoflr4bluqblh73mlbANCiANCmBmKHgpID0gzrsqZV4oLc67KngpYCBmb3IgeCA+PSAwDQpgZih4KSA9IDBgIGZvciB4IDwgMC4gDQogDQrlhbbkuK1sYW1iZGEgzrsgPiAw5piv5YiG5biD55qE5LiA5Liq5Y+C5pWw77yM5bi46KKr56ew5Li6546H5Y+C5pWw77yIcmF0ZSBwYXJhbWV0ZXLvvIku5Y2z5q+P5Y2V5L2N5pe26Ze05Y+R55Sf6K+l5LqL5Lu255qE5qyh5pWw44CC5oyH5pWw5YiG5biD55qE5Yy66Ze05pivWzAs4oieKeOAgiDlpoLmnpzkuIDkuKrpmo/mnLrlj5jph49YIOWRiOaMh+aVsOWIhuW4g++8jOWImeWPr+S7peWGmeS9nO+8mlggfiBFeHBvbmVudGlhbO+8iM6777yJ44CCIEUoeCk9MS/OuyxWYXIoeCk9MS/Ou14yDQogDQpkZXhwKHgsIHJhdGUgPSAxLCBsb2cgPSBGQUxTRSkNCg0KcGV4cChxLCByYXRlID0gMSwgbG93ZXIudGFpbCA9IFRSVUUsIGxvZy5wID0gRkFMU0UpDQoNCnFleHAocCwgcmF0ZSA9IDEsIGxvd2VyLnRhaWwgPSBUUlVFLCBsb2cucCA9IEZBTFNFKQ0KDQpyZXhwKG4sIHJhdGUgPSAxKQ0KDQrlgYforr7lnKjlhazkuqTnq5nlj7DnrYnlhazkuqTovablubPlnYcxMOWIhumSn+acieS4gOi2n+i9pu+8jOmCo+S5iOavj+Wwj+aXtuWAmeaciTbotp/ovabvvIzljbPmr4/lsI/ml7blh7rnjrDovabnmoTmrKHmlbB+IEV4cG9uZW50aWFsKDEvNikNCuaIkeS7rOWPr+S7peS6p+eUnzEw5Liq6L+Z5Lqb6ZqP5py65pWw55yL55yLcmV4cCgxMCwxLzYpDQo2MC8ocmV4cDEwLDEvNinljbPkuLrmiJHku6zlnKjnq5nlj7DnrYnovabnmoTpmo/mnLrml7bpl7TvvIzlpoLkuIvvvJoNCiBbMV0gIDYuNDQzMTQ4IDI0LjMzNzEzMSAgNi40NzcwOTYgIDIuODI0NjM4IDE1LjE4NDk0NSAxNC41OTQ5MDMNCiBbN10gIDcuMTMzODQyICA4LjIyMjQwMCA0Mi42MDk3ODQgMTUuMTgyODI3DQrlj6/ku6XnnIvop4Hnq5/nhLbmnInkuIDkuKo0Mi425YiG6ZKf55qE6ZqP5py65pWw5Ye6546w77yM5o2u6K+06L+Z56eN5oOF5Ya15LiL5L2g5Y+v5Lul5oqV6K+J5LiK5rW355qE5YWs5Lqk5YWs5Y+444CCDQrkuI3ov4d456ym5ZCI5oyH5pWw5YiG5biD77yMMS946L+Y56ym5ZCI5oyH5pWw5YiG5biD5ZCX77yfDQpwZXhwKDYsMS82KT0wLjYzMjEyMDYsIOS5n+WwseaYr+ivtOi/meenjeaDheWGteS4i+WPquaciTM3JeeahOWPr+iDveWFrOS6pOi9puS8mjEw5YiG6ZKf5Lul5YaF5p2l44CCDQrmjInnhafku6XkuIrliIbmnpDkuIDkuKrlsI/ml7blh7rnjrDnmoTlhazkuqTovabmrKHmlbDlupTor6XkuI3nrKblkIjmjIfmlbDliIbluIPjgIINCg0KYGBge3IgRXhwb25lbnRpYWwgRGVuc2l0eSBEaXN0cmlidXRpb259DQpzZXQuc2VlZCgxKQ0KeDwtc2VxKC0xLDIsbGVuZ3RoLm91dD0xMDApDQp5PC1kZXhwKHgsMC41KQ0KDQpwbG90KHgseSxjb2w9InJlZCIseGxpbT1jKDAsMikseWxpbT1jKDAsNSksdHlwZT0nbCcsDQogICAgIHhheHM9ImkiLCB5YXhzPSJpIix5bGFiPSdkZW5zaXR5Jyx4bGFiPScnLA0KICAgICBtYWluPSJUaGUgRXhwb25lbnRpYWwgRGVuc2l0eSBEaXN0cmlidXRpb24iKQ0KbGluZXMoeCxkZXhwKHgsMSksY29sPSJncmVlbiIpDQpsaW5lcyh4LGRleHAoeCwyKSxjb2w9ImJsdWUiKQ0KbGluZXMoeCxkZXhwKHgsNSksY29sPSJvcmFuZ2UiKQ0KDQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQ9cGFzdGUoInJhdGU9IixjKC41LCAxLCAyLDUpKSwgbHdkPTEsY29sPWMoInJlZCIsICJncmVlbiIsImJsdWUiLCJvcmFuZ2UiKSkNCmBgYA0KDQojIyMjIDkuMiDmjIfmlbDliIbluIPntK/np6/liIbluIPlh73mlbANCg0KYGYoeCwgzrspID0gMS1lXigtzrsqeClgIGZvciB4ID49IDANCmBmKHgsIM67KSA9IDBgIGZvciB4IDwgMC4gDQoNCmBgYHtyIEV4cG9uZW50aWFsIEN1bXVsYXRpdmUgRGlzdHJpYnV0aW9uIEZ1bmN0aW9ufQ0Kc2V0LnNlZWQoMSkNCng8LXNlcSgtMSwyLGxlbmd0aC5vdXQ9MTAwKQ0KeTwtcGV4cCh4LDAuNSkNCg0KcGxvdCh4LHksY29sPSJyZWQiLHhsaW09YygwLDIpLHlsaW09YygwLDEpLHR5cGU9J2wnLA0KICAgICB4YXhzPSJpIiwgeWF4cz0iaSIseWxhYj0nZGVuc2l0eScseGxhYj0nJywNCiAgICAgbWFpbj0iVGhlIEV4cG9uZW50aWFsIEN1bXVsYXRpdmUgRGlzdHJpYnV0aW9uIEZ1bmN0aW9uIikNCmxpbmVzKHgscGV4cCh4LDEpLGNvbD0iZ3JlZW4iKQ0KbGluZXMoeCxwZXhwKHgsMiksY29sPSJibHVlIikNCmxpbmVzKHgscGV4cCh4LDUpLGNvbD0ib3JhbmdlIikNCg0KbGVnZW5kKCJib3R0b21yaWdodCIsbGVnZW5kPXBhc3RlKCJyYXRlPSIsYyguNSwgMSwgMiw1KSksIGx3ZD0xLCBjb2w9YygicmVkIiwgImdyZWVuIiwiYmx1ZSIsIm9yYW5nZSIpKQ0KYGBgDQoNCiMjIyMgOS4zIOaMh+aVsOWIhuW4gy3liIbluIPmo4DpqowNCg0KS29sbW9nb3Jvdi1TbWlybm926L+e57ut5YiG5biD5qOA6aqMOuajgOmqjOWNleS4gOagt+acrOaYr+S4jeaYr+acjeS7juafkOS4gOmihOWFiOWBh+iuvueahOeJueWumuWIhuW4g+eahOaWueazleOAguS7peagt+acrOaVsOaNrueahOe0r+iuoemikeaVsOWIhuW4g+S4jueJueWumueQhuiuuuWIhuW4g+avlOi+g++8jOiLpeS4pOiAhemXtOeahOW3rui3neW+iOWwj++8jOWImeaOqOiuuuivpeagt+acrOWPluiHquafkOeJueWumuWIhuW4g+aXj+OAgg0KDQror6Xmo4Dpqozljp/lgYforr7kuLpIMDrmlbDmja7pm4bnrKblkIjmjIfmlbDliIbluIPvvIxIMTrmoLfmnKzmiYDmnaXoh6rnmoTmgLvkvZPliIbluIPkuI3nrKblkIjmjIfmlbDliIbluIPjgILku6RGMCh4KeihqOekuumihOWFiOWBh+iuvueahOeQhuiuuuWIhuW4g++8jEZuKHgp6KGo56S66ZqP5py65qC35pys55qE57Sv6K6h5qaC546HKOmikeeOhynlh73mlbAuDQoNCue7n+iuoemHj0TkuLo6IGBEPW1heHxGMCh4KSAtIEZuKHgpfGANCg0KROWAvOi2iuWwj++8jOi2iuaOpei/kTDvvIzooajnpLrmoLfmnKzmlbDmja7otormjqXov5HmjIfmlbDliIbluIMNCnDlgLzvvIzlpoLmnpxwLXZhbHVl5bCP5LqO5pi+6JGX5oCn5rC05bmzzrEoMC4wNSnvvIzliJnmi5Lnu51IMA0KYGBge3IgS29sbW9nb3Jvdi1TbWlybm92IHRlc3R9DQpzZXQuc2VlZCgxKQ0KUzwtcmV4cCgxMDAwKQ0Ka3MudGVzdChTLCAicGV4cCIpDQojIAlPbmUtc2FtcGxlIEtvbG1vZ29yb3YtU21pcm5vdiB0ZXN0DQojIGRhdGE6ICBTDQojIEQgPSAwLjAzODcsIHAtdmFsdWUgPSAwLjEwMDENCiMgYWx0ZXJuYXRpdmUgaHlwb3RoZXNpczogdHdvLXNpZGVkDQpgYGANCue7k+iuujogROWAvOW+iOWwjywgcC12YWx1ZT4wLjA177yM5LiN6IO95ouS57ud5Y6f5YGH6K6+77yM5omA5Lul5pWw5o2u6ZuGU+espuWQiOaMh+aVsOWIhuW4g++8gQ0KDQoNCiMjIyAxMC7ljaHmlrnliIbluIMobm9uLWNlbnRyYWwpQ2hpLVNxdWFyZWQgRGlzdHJpYnV0aW9u77yMY2hpc3ENCg0Kz4fCsijljaHmlrkp5YiG5biDDQroi6Vu5Liq55u45LqS54us56uL55qE6ZqP5py65Y+Y6YePzr7igoHjgIHOvuKCguOAgeKApuKApuOAgc6+biDvvIzlnYfmnI3ku47moIflh4bmraPmgIHliIbluIPvvIjkuZ/np7Dni6znq4vlkIzliIbluIPkuo7moIflh4bmraPmgIHliIbluIPvvInvvIzliJnov5lu5Liq5pyN5LuO5qCH5YeG5q2j5oCB5YiG5biD55qE6ZqP5py65Y+Y6YeP55qE5bmz5pa55ZKM5p6E5oiQ5LiA5paw55qE6ZqP5py65Y+Y6YeP77yM5YW25YiG5biD6KeE5b6L56ew5Li6z4fCsuWIhuW4g++8iGNoaS1zcXVhcmUgZGlzdHJpYnV0aW9u77yJ44CC5YW25Lit5Y+C5pWwbuensOS4uuiHqueUseW6pu+8jOiHqueUseW6puS4jeWQjOWwseaYr+WPpuS4gOS4qs+HwrLliIbluIPvvIzmraPlpoLmraPmgIHliIbluIPkuK3lnYflgLzmiJbmlrnlt67kuI3lkIzlsLHmmK/lj6bkuIDkuKrmraPmgIHliIbluIPkuIDmoLfjgIINCg0K5a6D5bm/5rOb55qE6L+Q55So5LqO5qOA5rWL5pWw5a2m5qih5Z6L5piv5ZCm6YCC5ZCI5omA5b6X55qE5pWw5o2u77yM5Lul5Y+K5pWw5o2u6Ze055qE55u45YWz5oCn44CC5pWw5o2u5bm25LiN6ZyA6KaB5ZGI5q2j5oCB5YiG5biDDQpr5Liq5qCH5YeG5q2j5oCB5Y+Y6YeP55qE5bmz5pa55ZKM5Y2z5Li66Ieq55Sx5bqm5Li6a+eahOWNoeaWueWIhuW4g+OAgg0KRSh4KT1rLFZhcih4KT0yay4NCiANCmRjaGlzcSh4LCBkZiwgbmNwPTAsIGxvZyA9IEZBTFNFKQ0KDQpwY2hpc3EocSwgZGYsIG5jcD0wLCBsb3dlci50YWlsID0gVFJVRSwgbG9nLnAgPSBGQUxTRSkNCg0KcWNoaXNxKHAsIGRmLCBuY3A9MCwgbG93ZXIudGFpbCA9IFRSVUUsIGxvZy5wID0gRkFMU0UpDQoNCnJjaGlzcShuLCBkZiwgbmNwPTApDQrlhbbkuK1kZuS4umRlZ3JlZXMgb2YgZnJlZWRvbeOAgm5jcOaYr25vbi1jZW50cmFsaXR5IHBhcmFtZXRlciAobm9uLW5lZ2F0aXZlKS5uY3A9MOaXtuaYr2NlbnRyYWzljaHmlrnliIbluIPvvIxuY3DkuI3kuLow5pe277yM6KGo56S66L+Z5Liq5Y2h5pa55YiG5biD5piv55Sx6Z2e5qCH5YeG5q2j5oCB5YiG5biD57uE5ZCI6ICM5oiQ77yMbmNwPei/meS6m+ato+aAgeWIhuW4g+eahOWdh+WAvOeahOW5s+aWueWSjOOAgg0KDQojIyMjIDEwLjEgIOWNoeaWueWIhuW4g+amgueOh+WvhuW6puWHveaVsA0KDQrOsyDmmK/kvL3njpvlh73mlbANCg0KYGBge3IgQ2hpc3EgRGVuc2l0eSBEaXN0cmlidXRpb259DQpzZXQuc2VlZCgxKQ0KeDwtc2VxKDAsMTAsbGVuZ3RoLm91dD0xMDAwKQ0KeTwtZGNoaXNxKHgsMSkNCg0KcGxvdCh4LHksY29sPSJyZWQiLHhsaW09YygwLDUpLHlsaW09YygwLDIpLHR5cGU9J2wnLA0KICAgICB4YXhzPSJpIiwgeWF4cz0iaSIseWxhYj0nZGVuc2l0eScseGxhYj0nJywNCiAgICAgbWFpbj0iVGhlIENoaXNxIERlbnNpdHkgRGlzdHJpYnV0aW9uIikNCg0KbGluZXMoeCxkY2hpc3EoeCwyKSxjb2w9ImdyZWVuIikNCmxpbmVzKHgsZGNoaXNxKHgsMyksY29sPSJibHVlIikNCmxpbmVzKHgsZGNoaXNxKHgsMTApLGNvbD0ib3JhbmdlIikNCg0KbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kPXBhc3RlKCJkZj0iLGMoMSwyLDMsMTApKSwgbHdkPTEsIGNvbD1jKCJyZWQiLCAiZ3JlZW4iLCJibHVlIiwib3JhbmdlIikpDQpgYGANCg0KIyMjIyAxMC4yICDljaHmlrnliIbluIPntK/np6/liIbluIPlh73mlbANCg0KzrMg5piv5Ly9546b5Ye95pWwDQoNCmBgYHtyIENoaXNxIEN1bXVsYXRpdmUgRGlzdHJpYnV0aW9uIEZ1bmN0aW9ufQ0Kc2V0LnNlZWQoMSkNCng8LXNlcSgwLDEwLGxlbmd0aC5vdXQ9MTAwMCkNCnk8LXBjaGlzcSh4LDEpDQoNCnBsb3QoeCx5LGNvbD0icmVkIix4bGltPWMoMCwxMCkseWxpbT1jKDAsMSksdHlwZT0nbCcsDQogICAgIHhheHM9ImkiLCB5YXhzPSJpIix5bGFiPSdkZW5zaXR5Jyx4bGFiPScnLA0KICAgICBtYWluPSJUaGUgQ2hpc3EgQ3VtdWxhdGl2ZSBEaXN0cmlidXRpb24gRnVuY3Rpb24iKQ0KDQpsaW5lcyh4LHBjaGlzcSh4LDIpLGNvbD0iZ3JlZW4iKQ0KbGluZXMoeCxwY2hpc3EoeCwzKSxjb2w9ImJsdWUiKQ0KbGluZXMoeCxwY2hpc3EoeCwxMCksY29sPSJvcmFuZ2UiKQ0KDQpsZWdlbmQoInRvcGxlZnQiLGxlZ2VuZD1wYXN0ZSgiZGY9IixjKDEsMiwzLDEwKSksIGx3ZD0xLCBjb2w9YygicmVkIiwgImdyZWVuIiwiYmx1ZSIsIm9yYW5nZSIpKQ0KYGBgDQoNCiMjIyMgMTAuMyAg5Y2h5pa55YiG5biDLeWIhuW4g+ajgOmqjA0KDQpLb2xtb2dvcm92LVNtaXJub3bov57nu63liIbluIPmo4Dpqow6IOajgOmqjOWNleS4gOagt+acrOaYr+S4jeaYr+acjeS7juafkOS4gOmihOWFiOWBh+iuvueahOeJueWumuWIhuW4g+eahOaWueazleOAguS7peagt+acrOaVsOaNrueahOe0r+iuoemikeaVsOWIhuW4g+S4jueJueWumueQhuiuuuWIhuW4g+avlOi+g++8jOiLpeS4pOiAhemXtOeahOW3rui3neW+iOWwj++8jOWImeaOqOiuuuivpeagt+acrOWPluiHquafkOeJueWumuWIhuW4g+aXj+OAgg0KDQror6Xmo4Dpqozljp/lgYforr7kuLpIMDrmlbDmja7pm4bnrKblkIjljaHmlrnliIbluIPvvIxIMTrmoLfmnKzmiYDmnaXoh6rnmoTmgLvkvZPliIbluIPkuI3nrKblkIjljaHmlrnliIbluIPjgILku6RGMCh4KeihqOekuumihOWFiOWBh+iuvueahOeQhuiuuuWIhuW4g++8jEZuKHgp6KGo56S66ZqP5py65qC35pys55qE57Sv6K6h5qaC546HKOmikeeOhynlh73mlbAuDQoNCue7n+iuoemHj0TkuLo6IEQ9bWF4fEYwKHgpIC0gRm4oeCl8DQoNCkTlgLzotorlsI/vvIzotormjqXov5Ew77yM6KGo56S65qC35pys5pWw5o2u6LaK5o6l6L+R5Y2h5pa55YiG5biDDQpw5YC877yM5aaC5p6ccC12YWx1ZeWwj+S6juaYvuiRl+aAp+awtOW5s86xKDAuMDUp77yM5YiZ5ouS57udSDANCg0KYGBge3IgS29sbW9nb3Jvdi1TbWlybm92IHRlc3QgY2hpc3F9DQpzZXQuc2VlZCgxKQ0KUzwtcmNoaXNxKDEwMDAsMSkNCmtzLnRlc3QoUywgInBjaGlzcSIsMSkNCiMgCU9uZS1zYW1wbGUgS29sbW9nb3Jvdi1TbWlybm92IHRlc3QNCiMgZGF0YTogIFMNCiMgRCA9IDAuMDI1NCwgcC12YWx1ZSA9IDAuNTM4NQ0KIyBhbHRlcm5hdGl2ZSBoeXBvdGhlc2lzOiB0d28tc2lkZWQNCmBgYA0K57uT6K66OiBE5YC85b6I5bCPLCBwLXZhbHVlPjAuMDXvvIzkuI3og73mi5Lnu53ljp/lgYforr7vvIzmiYDku6XmlbDmja7pm4ZT56ym5ZCIZGY9MeeahOWNoeaWueWIhuW4g++8gQ0KDQoNCg0KIyMjIDExLs6y5YiG5biDQmV0YSBEaXN0cmlidXRpb27vvIxiZXRhDQoNCui0neWhlOWIhuW4gyhCZXRhIERpc3RyaWJ1dGlvbinmmK/mjIfkuIDnu4TlrprkuYnlnKgoMCwxKeWMuumXtOeahOi/nue7reamgueOh+WIhuW4g++8jEJldGHliIbluIPmnInOseWSjM6y5Lik5Liq5Y+C5pWwzrEszrI+MO+8jOWFtuS4rc6x5Li65oiQ5Yqf5qyh5pWw5YqgMe+8jM6y5Li65aSx6LSl5qyh5pWw5YqgMeOAgg0KDQpCZXRh5YiG5biD55qE5LiA5Liq6YeN6KaB5bqU6K+l5piv5L2c5Li65Lyv5Yqq5Yip5YiG5biD5ZKM5LqM6aG55byP5YiG5biD55qE5YWx6L2t5YWI6aqM5YiG5biD5Ye6546w77yM5Zyo5py65Zmo5a2m5Lmg5ZKM5pWw55CG57uf6K6h5a2m5Lit5pyJ6YeN6KaB5bqU55So44CC6LSd5aGU5YiG5biD5Lit55qE5Y+C5pWw5Y+v5Lul55CG6Kej5Li65Lyq6K6h5pWw77yM5Lyv5Yqq5Yip5YiG5biD55qE5Ly854S25Ye95pWw5Y+v5Lul6KGo56S65Li677yM6KGo56S65LiA5qyh5LqL5Lu25Y+R55Sf55qE5qaC546H77yM5a6D5Li66LSd5aGU5pyJ55u45ZCM55qE5b2i5byP77yM5Zug5q2k5Y+v5Lul55So6LSd5aGU5YiG5biD5L2c5Li65YW25YWI6aqM5YiG5biD44CCDQoNCuWPmOmHj3jku4Xog73lh7rnjrDkuo4w5YiwMeS5i+mXtOOAgg0K56m65rCU5Lit5ZCr5pyJ55qE5rCU5L2T54q25oCB55qE5rC05YiG44CC6KGo56S66L+Z56eN5rC05YiG55qE5LiA56eN5Yqe5rOV5bCx5piv55u45a+55rm/5bqm44CC5Y2z546w5Zyo55qE5ZCr5rC06YeP5LiO56m65rCU55qE5pyA5aSn5ZCr5rC06YeP77yI6aWx5ZKM5ZCr5rC06YeP77yJ55qE5q+U5YC844CC5oiR5Lus5ZCs5Yiw55qE5aSp5rCU6aKE5ZGK55So6K+t5Lit5bCx57uP5bi45L2/55So55u45a+55rm/5bqm6L+Z5Liq5ZCN6K+N44CCDQrnm7jlr7nmub/luqbnmoTlgLzmmL7nhLbku4Xog73lh7rnjrDkuo4w5YiwMeS5i+mXtO+8iOe7j+W4uOeUqOeZvuWIhuavlOihqOekuu+8ieOAguWGrOWto+WhlOmHjOacqOebhuWcsOeahOaXpeacgOWkp+ebuOWvuea5v+W6puWSjOWkj+Wto+aXpeacgOWwj+ebuOWvuea5v+W6puOAguivgeWunuWug+S7rOmDveespuWQiOi0neWhlOWIhuW4gw0KZGJldGEoeCwgc2hhcGUxLCBzaGFwZTIsIG5jcCA9IDAsIGxvZyA9IEZBTFNFKQ0KDQpwYmV0YShxLCBzaGFwZTEsIHNoYXBlMiwgbmNwID0gMCwgbG93ZXIudGFpbCA9IFRSVUUsIGxvZy5wID0gRkFMU0UpDQoNCnFiZXRhKHAsIHNoYXBlMSwgc2hhcGUyLCBuY3AgPSAwLCBsb3dlci50YWlsID0gVFJVRSwgbG9nLnAgPSBGQUxTRSkNCg0KcmJldGEobiwgc2hhcGUxLCBzaGFwZTIsIG5jcCA9IDApDQoNCnNoYXBlMe+8jHNoYXBlMuaYr2JldGHliIbluIPnmoTkuKTkuKrlj4LmlbDjgIJFKHgpPXMxLyhzMStzMiksdmFyKHgpPXMxKnMyLyhzMStzMileMiAqIChzMStzMisxKQ0KDQojIyMjIDExLjEgQmV0YeWIhuW4g+amgueOh+WvhuW6puWHveaVsA0KDQrpmo/mnLrlj5jph49Y5pyN5LuO5Y+C5pWw5Li6YSwgzrLvvIzmnI3ku45CZXRh5YiG5biDDQrOsyDmmK/kvL3njpvlh73mlbANCmBgYHtyIEJldGEgRGVuc2l0eSBEaXN0cmlidXRpb259DQpzZXQuc2VlZCgxKQ0KeDwtc2VxKC01LDUsbGVuZ3RoLm91dD0xMDAwMCkNCnk8LWRiZXRhKHgsMC41LDAuNSkNCiAgDQpwbG90KHgseSxjb2w9InJlZCIseGxpbT1jKDAsMSkseWxpbT1jKDAsNiksdHlwZT0nbCcsDQogICAgIHhheHM9ImkiLCB5YXhzPSJpIix5bGFiPSdkZW5zaXR5Jyx4bGFiPScnLA0KICAgICBtYWluPSJUaGUgQmV0YSBEZW5zaXR5IERpc3RyaWJ1dGlvbiIpDQoNCmxpbmVzKHgsZGJldGEoeCw1LDEpLGNvbD0iZ3JlZW4iKQ0KbGluZXMoeCxkYmV0YSh4LDEsMyksY29sPSJibHVlIikNCmxpbmVzKHgsZGJldGEoeCwyLDIpLGNvbD0ib3JhbmdlIikNCmxpbmVzKHgsZGJldGEoeCwyLDUpLGNvbD0iYmxhY2siKQ0KDQpsZWdlbmQoInRvcCIsbGVnZW5kPXBhc3RlKCJhPSIsYyguNSw1LDEsMiwyKSwiIGI9IiwgYyguNSwxLDMsMiw1KSksIGx3ZD0xLGNvbD1jKCJyZWQiLCAiZ3JlZW4iLCJibHVlIiwib3JhbmdlIiwiYmxhY2siKSkNCmBgYA0KDQoNCiMjIyMgMTEuMiBCZXRh5YiG5biDLee0r+enr+WIhuW4g+WHveaVsA0KDQpgYGB7ciBCZXRhIEN1bXVsYXRpdmUgRGlzdHJpYnV0aW9uIEZ1bmN0aW9ufQ0Kc2V0LnNlZWQoMSkNCng8LXNlcSgtNSw1LGxlbmd0aC5vdXQ9MTAwMDApDQp5PC1wYmV0YSh4LDAuNSwwLjUpDQoNCnBsb3QoeCx5LGNvbD0icmVkIix4bGltPWMoMCwxKSx5bGltPWMoMCwxKSx0eXBlPSdsJywNCiAgICAgeGF4cz0iaSIsIHlheHM9ImkiLHlsYWI9J2RlbnNpdHknLHhsYWI9JycsDQogICAgIG1haW49IlRoZSBCZXRhIEN1bXVsYXRpdmUgRGlzdHJpYnV0aW9uIEZ1bmN0aW9uIikNCg0KbGluZXMoeCxwYmV0YSh4LDUsMSksY29sPSJncmVlbiIpDQpsaW5lcyh4LHBiZXRhKHgsMSwzKSxjb2w9ImJsdWUiKQ0KbGluZXMoeCxwYmV0YSh4LDIsMiksY29sPSJvcmFuZ2UiKQ0KbGluZXMoeCxwYmV0YSh4LDIsNSksY29sPSJibGFjayIpDQoNCmxlZ2VuZCgidG9wbGVmdCIsbGVnZW5kPXBhc3RlKCJhPSIsYyguNSw1LDEsMiwyKSwiIGI9IiwgYyguNSwxLDMsMiw1KSksIGx3ZD0xLGNvbD1jKCJyZWQiLCAiZ3JlZW4iLCJibHVlIiwib3JhbmdlIiwiYmxhY2siKSkNCmBgYA0KDQojIyMjIDExLjMgQmV0YeWIhuW4gy3liIbluIPmo4DpqowNCg0KS29sbW9nb3Jvdi1TbWlybm926L+e57ut5YiG5biD5qOA6aqMOiDmo4DpqozljZXkuIDmoLfmnKzmmK/kuI3mmK/mnI3ku47mn5DkuIDpooTlhYjlgYforr7nmoTnibnlrprliIbluIPnmoTmlrnms5XjgILku6XmoLfmnKzmlbDmja7nmoTntK/orqHpopHmlbDliIbluIPkuI7nibnlrprnkIborrrliIbluIPmr5TovoPvvIzoi6XkuKTogIXpl7TnmoTlt67ot53lvojlsI/vvIzliJnmjqjorrror6XmoLfmnKzlj5boh6rmn5DnibnlrprliIbluIPml4/jgIINCg0K6K+l5qOA6aqM5Y6f5YGH6K6+5Li6SDA65pWw5o2u6ZuG56ym5ZCIQmV0YeWIhuW4g++8jEgxOuagt+acrOaJgOadpeiHqueahOaAu+S9k+WIhuW4g+S4jeespuWQiEJldGHliIbluIPjgILku6RGMCh4KeihqOekuumihOWFiOWBh+iuvueahOeQhuiuuuWIhuW4g++8jEZuKHgp6KGo56S66ZqP5py65qC35pys55qE57Sv6K6h5qaC546HKOmikeeOhynlh73mlbAuDQoNCue7n+iuoemHj0TkuLo6IEQ9bWF4fEYwKHgpIC0gRm4oeCl8DQoNCkTlgLzotorlsI/vvIzotormjqXov5Ew77yM6KGo56S65qC35pys5pWw5o2u6LaK5o6l6L+RQmV0YeWIhuW4gw0KcOWAvO+8jOWmguaenHAtdmFsdWXlsI/kuo7mmL7okZfmgKfmsLTlubPOsSgwLjA1Ke+8jOWImeaLkue7nUgwDQoNCmBgYHtyIEtvbG1vZ29yb3YtU21pcm5vdiB0ZXN0IGJldGEgZGlzdHJpYnV0aW9ufQ0Kc2V0LnNlZWQoMSkNClM8LXJiZXRhKDEwMDAsMSwyKQ0Ka3MudGVzdChTLCAicGJldGEiLDEsMikNCiMgCU9uZS1zYW1wbGUgS29sbW9nb3Jvdi1TbWlybm92IHRlc3QNCiMgZGF0YTogIFMNCiMgRCA9IDAuMDIwMiwgcC12YWx1ZSA9IDAuODA3DQojIGFsdGVybmF0aXZlIGh5cG90aGVzaXM6IHR3by1zaWRlZA0KYGBgDQrnu5Porro6IETlgLzlvojlsI8sIHAtdmFsdWU+MC4wNe+8jOS4jeiDveaLkue7neWOn+WBh+iuvu+8jOaJgOS7peaVsOaNrumbhlPnrKblkIhzaGFwZTE9MSwgc2hhcGUyPTLnmoRCZXRh5YiG5biD77yBDQoNCiANCiMjIyAxMi505YiG5biDU3R1ZGVudCB0IERpc3RyaWJ1dGlvbu+8jHQNCg0K5a2m55SfdC3liIbluIPvvIhTdHVkZW50J3MgdC1kaXN0cmlidXRpb27vvInvvIzlj6/nroDnp7DkuLp05YiG5biD44CC5bqU55So5Zyo5Lyw6K6h5ZGI5q2j5oCB5YiG5biD55qE5q+N576k5L2T5LmL5bmz5Z2H5pWw44CC5a6D5piv5a+55Lik5Liq5qC35pys5Z2H5YC85beu5byC6L+b6KGM5pi+6JGX5oCn5rWL6K+V55qE5a2m55SfdOajgOWumueahOWfuuehgOOAguWtpueUn3Tmo4DlrprmlLnov5vkuoZa5qOA5a6a77yIWi10ZXN077yJ77yM5Zug5Li6WuajgOWumuS7peavjeS9k+agh+WHhuW3ruW3suefpeS4uuWJjeaPkOOAguiZveeEtuWcqOagt+acrOaVsOmHj+Wkp++8iOi2hei/hzMw5Liq77yJ5pe277yM5Y+v5Lul5bqU55SoWuajgOWumuadpeaxguW+l+i/keS8vOWAvO+8jOS9hlrmo4DlrprnlKjlnKjlsI/moLfmnKzkvJrkuqfnlJ/lvojlpKfnmoTor6/lt67vvIzlm6DmraTlv4XpobvmlLnnlKjlrabnlJ905qOA5a6a5Lul5rGC5YeG56Gu44CCDQoNCuWcqOavjeS9k+agh+WHhuW3ruacquefpeeahOaDheWGteS4i++8jOS4jeiuuuagt+acrOaVsOmHj+Wkp+aIluWwj+eahuWPr+W6lOeUqOWtpueUn3Tmo4DlrprjgILlnKjlvoXmr5TovoPnmoTmlbDmja7mnInkuInnu4Tku6XkuIrml7bvvIzlm6DkuLror6/lt67ml6Dms5XljovkvY7vvIzmraTml7blj6/ku6XnlKjlj5jlvILmlbDliIbmnpDvvIhBTk9WQe+8ieS7o+abv+WtpueUn3Tmo4DlrprjgIINCg0K5bqU55So5Zyo5b2T5a+55ZGI5q2j5oCB5YiG5biD55qE5q+N576k5L2T55qE5Z2H5YC86L+b6KGM5Lyw6K6h44CC5b2T5q+N576k5L2T55qE5qCH5YeG5beu5piv5pyq55+l55qE5L2G5Y205Y+I6ZyA6KaB5Lyw6K6h5pe277yM5oiR5Lus5Y+v5Lul6L+Q55So5a2m55SfdCDliIbluIPjgIINCuWtpueUn3Qg5YiG5biD5Y+v566A56ew5Li6dCDliIbluIPjgILlhbbmjqjlr7znlLHlqIHlu4nCt+aIiOWhnuS6jjE5MDjlubTpppblhYjlj5HooajvvIzlvZPml7bku5bov5jlnKjpg73mn4/mnpfnmoTlgaXlipvlo6vphb/phZLljoLlt6XkvZzjgILlm6DkuLrkuI3og73ku6Xku5bmnKzkurrnmoTlkI3kuYnlj5HooajvvIzmiYDku6Xorrrmlofkvb/nlKjkuoblrabnlJ/vvIhTdHVkZW5077yJ6L+Z5LiA56yU5ZCN44CC5LmL5ZCOdCDmo4Dpqozku6Xlj4rnm7jlhbPnkIborrrnu4/nlLHnvZfnurPlvrfCt+i0uembqueahOW3peS9nOWPkeaJrOWFieWkp++8jOiAjOato+aYr+S7luWwhuatpOWIhuW4g+ensOS4uuWtpueUn+WIhuW4g+OAgg0KZHQoeCwgZGYsIG5jcCwgbG9nID0gRkFMU0UpDQoNCnB0KHEsIGRmLCBuY3AsIGxvd2VyLnRhaWwgPSBUUlVFLCBsb2cucCA9IEZBTFNFKQ0KDQpxdChwLCBkZiwgbmNwLCBsb3dlci50YWlsID0gVFJVRSwgbG9nLnAgPSBGQUxTRSkNCg0KcnQobiwgZGYsIG5jcCkNCuWFtuS4rWRm5piv6Ieq55Sx5bqm77yMbmNw5pivbm9uLWNlbnRyYWxpdHkgcGFyYW1ldGVyIGRlbHRh77yMSWYgb21pdHRlZCwgdXNlIHRoZSBjZW50cmFsIHQgZGlzdHJpYnV0aW9u44CCbmNw5Ye6546w5pe26KGo56S65YiG5biD55Sx6Z2e5qCH5YeG55qE5Y2h5pa55YiG5biD5p6E5oiQ44CCDQoNCiMjIyMgMTIuMSDmpoLnjoflr4bluqblh73mlbANCg0KdiDnrYnkuo5uIOKIkiAx44CCIFTnmoTliIbluIPnp7DkuLp0LeWIhuW4g+OAguWPguaVsFxudSDkuIDoiKzooqvnp7DkuLroh6rnlLHluqbjgIINCs6zIOaYr+S8veeOm+WHveaVsOOAgg0KYGBge3IgVCBEZW5zaXR5IERpc3RyaWJ1dGlvbn0NCnNldC5zZWVkKDEpDQp4PC1zZXEoLTUsNSxsZW5ndGgub3V0PTEwMDApDQp5PC1kdCh4LDEsMCkNCg0KcGxvdCh4LHksY29sPSJyZWQiLHhsaW09YygtNSw1KSx5bGltPWMoMCwwLjUpLHR5cGU9J2wnLA0KICAgICB4YXhzPSJpIiwgeWF4cz0iaSIseWxhYj0nZGVuc2l0eScseGxhYj0nJywNCiAgICAgbWFpbj0iVGhlIFQgRGVuc2l0eSBEaXN0cmlidXRpb24iKQ0KDQpsaW5lcyh4LGR0KHgsNSwwKSxjb2w9ImdyZWVuIikNCmxpbmVzKHgsZHQoeCw1LDIpLGNvbD0iYmx1ZSIpDQpsaW5lcyh4LGR0KHgsNTAsNCksY29sPSJvcmFuZ2UiKQ0KDQpsZWdlbmQoInRvcGxlZnQiLGxlZ2VuZD1wYXN0ZSgiZGY9IixjKDEsNSw1LDUwKSwiIG5jcD0iLCBjKDAsMCwyLDQpKSwgbHdkPTEsIGNvbD1jKCJyZWQiLCAiZ3JlZW4iLCJibHVlIiwib3JhbmdlIikpDQpgYGANCg0KIyMjIyAxMi4yICBU5YiG5biDLee0r+enr+WIhuW4g+WHveaVsA0KDQp2IOetieS6jm4g4oiSIDHjgIIgVOeahOWIhuW4g+ensOS4unQt5YiG5biD44CC5Y+C5pWwXG51IOS4gOiIrOiiq+ensOS4uuiHqueUseW6puOAgg0KzrMg5piv5Ly9546b5Ye95pWw44CCDQpgYGB7ciBUIEN1bXVsYXRpdmUgRGlzdHJpYnV0aW9uIEZ1bmN0aW9ufQ0Kc2V0LnNlZWQoMSkNCng8LXNlcSgtNSw1LGxlbmd0aC5vdXQ9MTAwMCkNCnk8LXB0KHgsMSwwKQ0KDQpwbG90KHgseSxjb2w9InJlZCIseGxpbT1jKC01LDUpLHlsaW09YygwLDAuNSksdHlwZT0nbCcsDQogICAgIHhheHM9ImkiLCB5YXhzPSJpIix5bGFiPSdkZW5zaXR5Jyx4bGFiPScnLA0KICAgICBtYWluPSJUaGUgVCBDdW11bGF0aXZlIERpc3RyaWJ1dGlvbiBGdW5jdGlvbiIpDQoNCmxpbmVzKHgscHQoeCw1LDApLGNvbD0iZ3JlZW4iKQ0KbGluZXMoeCxwdCh4LDUsMiksY29sPSJibHVlIikNCmxpbmVzKHgscHQoeCw1MCw0KSxjb2w9Im9yYW5nZSIpDQoNCmxlZ2VuZCgidG9wbGVmdCIsbGVnZW5kPXBhc3RlKCJkZj0iLGMoMSw1LDUsNTApLCIgbmNwPSIsIGMoMCwwLDIsNCkpLCBsd2Q9MSwgY29sPWMoInJlZCIsICJncmVlbiIsImJsdWUiLCJvcmFuZ2UiKSkNCmBgYA0KDQojIyMjIDEyLjMgIFTliIbluIMt5YiG5biD5qOA6aqMDQpLb2xtb2dvcm92LVNtaXJub3bov57nu63liIbluIPmo4Dpqow6IOajgOmqjOWNleS4gOagt+acrOaYr+S4jeaYr+acjeS7juafkOS4gOmihOWFiOWBh+iuvueahOeJueWumuWIhuW4g+eahOaWueazleOAguS7peagt+acrOaVsOaNrueahOe0r+iuoemikeaVsOWIhuW4g+S4jueJueWumueQhuiuuuWIhuW4g+avlOi+g++8jOiLpeS4pOiAhemXtOeahOW3rui3neW+iOWwj++8jOWImeaOqOiuuuivpeagt+acrOWPluiHquafkOeJueWumuWIhuW4g+aXj+OAgg0KDQror6Xmo4Dpqozljp/lgYforr7kuLpIMDrmlbDmja7pm4bnrKblkIhU5YiG5biD77yMSDE65qC35pys5omA5p2l6Ieq55qE5oC75L2T5YiG5biD5LiN56ym5ZCIVOWIhuW4g+OAguS7pEYwKHgp6KGo56S66aKE5YWI5YGH6K6+55qE55CG6K665YiG5biD77yMRm4oeCnooajnpLrpmo/mnLrmoLfmnKznmoTntK/orqHmpoLnjoco6aKR546HKeWHveaVsC4NCg0K57uf6K6h6YePROS4ujogRD1tYXh8RjAoeCkgLSBGbih4KXwNCg0KROWAvOi2iuWwj++8jOi2iuaOpei/kTDvvIzooajnpLrmoLfmnKzmlbDmja7otormjqXov5FU5YiG5biDDQpw5YC877yM5aaC5p6ccC12YWx1ZeWwj+S6juaYvuiRl+aAp+awtOW5s86xKDAuMDUp77yM5YiZ5ouS57udSDANCg0KYGBge3IgS29sbW9nb3Jvdi1TbWlybm92IHRlc3QgVCBEaXN0cmlidXRpb259DQpzZXQuc2VlZCgxKQ0KUzwtcnQoMTAwMCwgMSwyKQ0Ka3MudGVzdChTLCAicHQiLCAxLCAyKQ0KIyAJT25lLXNhbXBsZSBLb2xtb2dvcm92LVNtaXJub3YgdGVzdA0KIyBkYXRhOiAgUw0KIyBEID0gMC4wMjUzLCBwLXZhbHVlID0gMC41NDYxDQojIGFsdGVybmF0aXZlIGh5cG90aGVzaXM6IHR3by1zaWRlZA0KYGBgDQrnu5Porro6IETlgLzlvojlsI8sIHAtdmFsdWU+MC4wNe+8jOS4jeiDveaLkue7neWOn+WBh+iuvu+8jOaJgOS7peaVsOaNrumbhlPnrKblkIhkZjE9MSwgbmNwPTLnmoRU5YiG5biD77yBDQoNCg0KDQoNCg0KDQoNCiMjIyAxMy5G5YiG5biDDQoNCkYt5YiG5biD77yIRi1kaXN0cmlidXRpb27vvInmmK/kuIDnp43ov57nu63mpoLnjofliIbluIPvvIzooqvlub/ms5vlupTnlKjkuo7kvLznhLbmr5Tnjofmo4DpqozvvIznibnliKvmmK9BTk9WQeS4reOAgkbliIbluIPlrprkuYnkuLrvvJrorr5Y44CBWeS4uuS4pOS4queLrOeri+eahOmaj+acuuWPmOmHj++8jFjmnI3ku47oh6rnlLHluqbkuLprMeeahOWNoeaWueWIhuW4g++8jFnmnI3ku47oh6rnlLHluqbkuLprMueahOWNoeaWueWIhuW4g++8jOi/mTIg5Liq54us56uL55qE5Y2h5pa55YiG5biD6KKr5ZCE6Ieq55qE6Ieq55Sx5bqm6Zmk5Lul5ZCO55qE5q+U546H6L+Z5LiA57uf6K6h6YeP55qE5YiG5biD44CC5Y2z77yaIOS4iuW8j0bmnI3ku47nrKzkuIDoh6rnlLHluqbkuLprMe+8jOesrOS6jOiHqueUseW6puS4umsy55qERuWIhuW4g+OAgg0KDQpG5YiG5biD55qE5oCn6LSoDQoNCuWug+aYr+S4gOenjemdnuWvueensOWIhuW4gw0KDQrlroPmnInkuKTkuKroh6rnlLHluqbvvIzljbNuMSAtMeWSjG4yLTHvvIznm7jlupTnmoTliIbluIPorrDkuLpG77yIIG4xIOKAkzHvvIwgbjItMe+8ie+8jCBuMSDigJMx6YCa5bi456ew5Li65YiG5a2Q6Ieq55Sx5bqm77yMIG4yLTHpgJrluLjnp7DkuLrliIbmr43oh6rnlLHluqYNCg0KRuWIhuW4g+aYr+S4gOS4quS7peiHqueUseW6pm4xIOKAkzHlkoxuMi0x5Li65Y+C5pWw55qE5YiG5biD5peP77yM5LiN5ZCM55qE6Ieq55Sx5bqm5Yaz5a6a5LqGRiDliIbluIPnmoTlvaLnirYNCg0KRuWIhuW4g+eahOWAkuaVsOaAp+i0qO+8mkbOsSxkZjEsZGYyPTEvRjEtzrEsZGYxLGRmMlsxXQ0KDQrkuIDkuKpGLeWIhuW4g+eahOmaj+acuuWPmOmHj+aYr+S4pOS4quWNoeaWueWIhuW4g+WPmOmHj+eahOavlOeOh+OAgkYt5YiG5biD6KKr5bm/5rOb5bqU55So5LqO5Ly854S25q+U546H5qOA6aqM77yM54m55Yir5piv5pa55beu5YiG5p6Q5LitDQpkZih4LCBkZjEsIGRmMiwgbmNwLCBsb2cgPSBGQUxTRSkNCg0KcGYocSwgZGYxLCBkZjIsIG5jcCwgbG93ZXIudGFpbCA9IFRSVUUsIGxvZy5wID0gRkFMU0UpDQoNCnFmKHAsIGRmMSwgZGYyLCBuY3AsIGxvd2VyLnRhaWwgPSBUUlVFLCBsb2cucCA9IEZBTFNFKQ0KDQpyZihuLCBkZjEsIGRmMiwgbmNwKQ0KZGYx77yMZGYy5piv5Lik5Liq6Ieq55Sx5bqm77yMbmNw5ZCMdOWIhuW4g+S4reeahG5jcOOAgg0KDQojIyMjIDEzLjEgRuWIhuW4g+eahOamgueOh+WvhuW6puWHveaVsA0KDQpgZih4KSA9IHNxcnQoKChkXzEqeCleZF8xICogZF8yXmRfMikvKChkXzEqeCArIGRfMileKGRfMSArIGRfMikpKS8oeCAqIEIoZF8xLzIsZF8yLzIpKWANCg0KQuaYr0JldGHlh73mlbAoYmV0YSBmdW5jdGlvbikNCg0KYGBge3J9DQpzZXQuc2VlZCgxKQ0KeDwtc2VxKDAsNSxsZW5ndGgub3V0PTEwMDApDQp5PC1kZih4LDEsMSwwKQ0KDQpwbG90KHgseSxjb2w9InJlZCIseGxpbT1jKDAsNSkseWxpbT1jKDAsMSksdHlwZT0nbCcsDQogICAgIHhheHM9ImkiLCB5YXhzPSJpIix5bGFiPSdkZW5zaXR5Jyx4bGFiPScnLA0KICAgICBtYWluPSJUaGUgRiBEZW5zaXR5IERpc3RyaWJ1dGlvbiIpDQoNCmxpbmVzKHgsZGYoeCwxLDEsMiksY29sPSJncmVlbiIpDQpsaW5lcyh4LGRmKHgsMiwyLDIpLGNvbD0iYmx1ZSIpDQpsaW5lcyh4LGRmKHgsMiw0LDQpLGNvbD0ib3JhbmdlIikNCg0KbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kPXBhc3RlKCJkZjE9IixjKDEsMSwyLDIpLCJkZjI9IixjKDEsMSwyLDQpLCIgbmNwPSIsIGMoMCwyLDIsNCkpLCBsd2Q9MSwgY29sPWMoInJlZCIsICJncmVlbiIsImJsdWUiLCJvcmFuZ2UiKSkNCmBgYA0KDQojIyMjIDEzLjIgRuWIhuW4g+eahOe0r+enr+WIhuW4g+WHveaVsA0KDQpmKHgpID0gDQpJ5piv5LiN5a6M5YWoQmV0YeWHveaVsA0KYGBge3IgRiBDdW11bGF0aXZlIERpc3RyaWJ1dGlvbiBGdW5jdGlvbn0NCnNldC5zZWVkKDEpDQp4PC1zZXEoMCw1LGxlbmd0aC5vdXQ9MTAwMCkNCnk8LWRmKHgsMSwxLDApDQoNCnBsb3QoeCx5LGNvbD0icmVkIix4bGltPWMoMCw1KSx5bGltPWMoMCwxKSx0eXBlPSdsJywNCiAgICAgeGF4cz0iaSIsIHlheHM9ImkiLHlsYWI9J2RlbnNpdHknLHhsYWI9JycsDQogICAgIG1haW49IlRoZSBGIEN1bXVsYXRpdmUgRGlzdHJpYnV0aW9uIEZ1bmN0aW9uIikNCg0KbGluZXMoeCxwZih4LDEsMSwyKSxjb2w9ImdyZWVuIikNCmxpbmVzKHgscGYoeCwyLDIsMiksY29sPSJibHVlIikNCmxpbmVzKHgscGYoeCwyLDQsNCksY29sPSJvcmFuZ2UiKQ0KDQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQ9cGFzdGUoImRmMT0iLGMoMSwxLDIsMiksImRmMj0iLGMoMSwxLDIsNCksIiBuY3A9IiwgYygwLDIsMiw0KSksIGx3ZD0xLCBjb2w9YygicmVkIiwgImdyZWVuIiwiYmx1ZSIsIm9yYW5nZSIpKQ0KYGBgDQoNCiMjIyMgMTMuMyBG5YiG5biDLeWIhuW4g+ajgOmqjA0KDQpLb2xtb2dvcm92LVNtaXJub3bov57nu63liIbluIPmo4Dpqow6IOajgOmqjOWNleS4gOagt+acrOaYr+S4jeaYr+acjeS7juafkOS4gOmihOWFiOWBh+iuvueahOeJueWumuWIhuW4g+eahOaWueazleOAguS7peagt+acrOaVsOaNrueahOe0r+iuoemikeaVsOWIhuW4g+S4jueJueWumueQhuiuuuWIhuW4g+avlOi+g++8jOiLpeS4pOiAhemXtOeahOW3rui3neW+iOWwj++8jOWImeaOqOiuuuivpeagt+acrOWPluiHquafkOeJueWumuWIhuW4g+aXj+OAgg0KDQror6Xmo4Dpqozljp/lgYforr7kuLpIMDrmlbDmja7pm4bnrKblkIhG5YiG5biD77yMSDE65qC35pys5omA5p2l6Ieq55qE5oC75L2T5YiG5biD5LiN56ym5ZCIRuWIhuW4g+OAguS7pEYwKHgp6KGo56S66aKE5YWI5YGH6K6+55qE55CG6K665YiG5biD77yMRm4oeCnooajnpLrpmo/mnLrmoLfmnKznmoTntK/orqHmpoLnjoco6aKR546HKeWHveaVsC4NCg0K57uf6K6h6YePROS4ujogRD1tYXh8RjAoeCkgLSBGbih4KXwNCg0KROWAvOi2iuWwj++8jOi2iuaOpei/kTDvvIzooajnpLrmoLfmnKzmlbDmja7otormjqXov5FG5YiG5biDDQpw5YC877yM5aaC5p6ccC12YWx1ZeWwj+S6juaYvuiRl+aAp+awtOW5s86xKDAuMDUp77yM5YiZ5ouS57udSDANCg0KYGBge3IgS29sbW9nb3Jvdi1TbWlybm92IHRlc3QgRiBEaXN0cmlidXRpb259DQpzZXQuc2VlZCgxKQ0KUzwtcmYoMTAwMCwxLDEsMikNCmtzLnRlc3QoUywgInBmIiwgMSwxLDIpDQojIAlPbmUtc2FtcGxlIEtvbG1vZ29yb3YtU21pcm5vdiB0ZXN0DQojIGRhdGE6ICBTDQojIEQgPSAwLjAxMTMsIHAtdmFsdWUgPSAwLjk5OTYNCiMgYWx0ZXJuYXRpdmUgaHlwb3RoZXNpczogdHdvLXNpZGVkDQpgYGANCue7k+iuujogROWAvOW+iOWwjywgcC12YWx1ZT4wLjA177yM5LiN6IO95ouS57ud5Y6f5YGH6K6+77yM5omA5Lul5pWw5o2u6ZuGU+espuWQiGRmMT0xLCBkZjI9MSwgbmNwPTLnmoRG5YiG5biD77yBDQoNCg0KDQoNCg0KIyMjIDE0LiDpn6bkvK/liIbluIMt6Z+m5rCP5YiG5biDLeWogeW4g+WwlOWIhuW4gy13ZWlidWxs5YiG5biDDQoNCndlaWJ1bGwo6Z+m5LyvKeWIhuW4g++8jOWPiOensOmfpuawj+WIhuW4g+aIluWogeW4g+WwlOWIhuW4g++8jOaYr+WPr+mdoOaAp+WIhuaekOWSjOWvv+WRveajgOmqjOeahOeQhuiuuuWfuuehgOOAgldlaWJ1bGzliIbluIPog73ooqvlupTnlKjkuo7lvojlpJrlvaLlvI/vvIzliIbluIPnlLHlvaLnirbjgIHlsLrluqbvvIjojIPlm7TvvInlkozkvY3nva7kuInkuKrlj4LmlbDlhrPlrprjgILlhbbkuK3lvaLnirblj4LmlbDmmK/mnIDph43opoHnmoTlj4LmlbDvvIzlhrPlrprliIbluIPlr4bluqbmm7Lnur/nmoTln7rmnKzlvaLnirbvvIzlsLrluqblj4LmlbDotbfmlL7lpKfmiJbnvKnlsI/mm7Lnur/nmoTkvZznlKjvvIzkvYbkuI3lvbHlk43liIbluIPnmoTlvaLnirbjgIINCg0KV2VpYnVsbOWIhuW4g+mAmuW4uOeUqOWcqOaVhemanOWIhuaekOmihuWfnyggZmllbGQgb2YgZmFpbHVyZSBhbmFseXNpcynkuK3vvJvlsKTlhbbmmK/lroPlj6/ku6XmqKHmi58obWltaWMpIOaVhemanOeOhyhmYWlsdHVyZSByYXRlKeaMgee7rSggb3ZlciB0aW1lKeWPmOWMlueahOWIhuW4g+OAguaVhemanOeOh+S4uu+8mg0KDQrkuIDnm7TkuLrluLjph48oY29uc3RhbnQgb3ZlciB0aW1lKe+8jCDpgqPkuYggzrEgPSAx77yMIOaal+ekuuWcqOmaj+acuuS6i+S7tuS4reWPkeeUnw0K5LiA55u05YeP5bCRKGRlY3JlYXNlcyBvdmVyIHRpbWUp77yM6YKj5LmIzrEgPCAx77yMIOaal+ekuiLml6nmnJ/lpLHmlYgoaW5mYW50IG1vcnRhbGl0eSkiDQrkuIDnm7Tlop7liqAoaW5jcmVhc2VzIG92ZXIgdGltZSnvvIzpgqPkuYjOsSA+IDHvvIwg5pqX56S6IuiAl+WwvSh3ZWFyIG91dCkiIC0g6ZqP552A5pe26Ze055qE5o6o6L+b77yM5aSx6LSl55qE5Y+v6IO95oCn5Y+Y5aSnDQoNCiMjIyMgMTQuMSDpn6bkvK/liIbluIPmpoLnjoflr4bluqblh73mlbANCg0KYGYoeCzOuyxrKSA9IChrL867KSAqICh4L867KV5lXigoLc67KngpXmspYCBmb3IgeCA+PSAwDQpgZih4LM67LGspID0gMGAgZm9yIHggPCAwLiANCg0KYGBge3IgV2VpYnVsbCBEZW5zaXR5IERpc3RyaWJ1dGlvbn0NCnNldC5zZWVkKDEpDQp4PC0gc2VxKDAsIDIuNSwgbGVuZ3RoLm91dD0xMDAwKQ0KeTwtIGR3ZWlidWxsKHgsIDAuNSkNCg0KcGxvdCh4LCB5LCB0eXBlPSJsIiwgY29sPSJibHVlIix4bGltPWMoMCwgMi41KSx5bGltPWMoMCwgNiksDQogICAgIHhheHM9ImkiLCB5YXhzPSJpIix5bGFiPSdkZW5zaXR5Jyx4bGFiPScnLA0KICAgICBtYWluPSJUaGUgV2VpYnVsbCBEZW5zaXR5IERpc3RyaWJ1dGlvbiIpDQoNCmxpbmVzKHgsIGR3ZWlidWxsKHgsIDEpLCB0eXBlPSJsIiwgY29sPSJyZWQiKQ0KbGluZXMoeCwgZHdlaWJ1bGwoeCwgMS41KSwgdHlwZT0ibCIsIGNvbD0ibWFnZW50YSIpDQpsaW5lcyh4LCBkd2VpYnVsbCh4LCA1KSwgdHlwZT0ibCIsIGNvbD0iZ3JlZW4iKQ0KbGluZXMoeCwgZHdlaWJ1bGwoeCwgMTUpLCB0eXBlPSJsIiwgY29sPSJwdXJwbGUiKQ0KbGVnZW5kKCJ0b3ByaWdodCIsIGxlZ2VuZD1wYXN0ZSgic2hhcGUgPSIsIGMoLjUsIDEsIDEuNSwgNSwgMTUpKSwgbHdkPTEsY29sPWMoImJsdWUiLCAicmVkIiwgIm1hZ2VudGEiLCAiZ3JlZW4iLCJwdXJwbGUiKSkNCmBgYA0KDQojIyMjIDE0LjIgIOmfpuS8r+WIhuW4g+e0r+enr+WIhuW4g+WHveaVsA0KDQpgZih4KSA9IDEgLSBlXigtKHgvzrspXmspYA0KDQpgYGB7ciBXZWlidWxsIEN1bXVsYXRpdmUgRGlzdHJpYnV0aW9uIEZ1bmN0aW9ufQ0Kc2V0LnNlZWQoMSkNCng8LSBzZXEoMCwgMi41LCBsZW5ndGgub3V0PTEwMDApDQp5PC0gcHdlaWJ1bGwoeCwgMC41KQ0KDQpwbG90KHgsIHksIHR5cGU9ImwiLCBjb2w9ImJsdWUiLHhsaW09YygwLCAyLjUpLHlsaW09YygwLCAxLjIpLA0KICAgICB4YXhzPSJpIiwgeWF4cz0iaSIseWxhYj0nZGVuc2l0eScseGxhYj0nJywNCiAgICAgbWFpbj0iVGhlIFdlaWJ1bGwgQ3VtdWxhdGl2ZSBEaXN0cmlidXRpb24gRnVuY3Rpb24iKQ0KDQpsaW5lcyh4LCBwd2VpYnVsbCh4LCAxKSwgdHlwZT0ibCIsIGNvbD0icmVkIikNCmxpbmVzKHgsIHB3ZWlidWxsKHgsIDEuNSksIHR5cGU9ImwiLCBjb2w9Im1hZ2VudGEiKQ0KbGluZXMoeCwgcHdlaWJ1bGwoeCwgNSksIHR5cGU9ImwiLCBjb2w9ImdyZWVuIikNCmxpbmVzKHgsIHB3ZWlidWxsKHgsIDE1KSwgdHlwZT0ibCIsIGNvbD0icHVycGxlIikNCmxlZ2VuZCgiYm90dG9tcmlnaHQiLCBsZWdlbmQ9cGFzdGUoInNoYXBlID0iLCBjKC41LCAxLCAxLjUsIDUsIDE1KSksIGx3ZD0xLCBjb2w9YygiYmx1ZSIsICJyZWQiLCAibWFnZW50YSIsICJncmVlbiIsInB1cnBsZSIpKQ0KYGBgDQoNCiMjIyMgMTQuMyDpn6bkvK/liIbluIMt5YiG5biD5qOA6aqMDQoNCktvbG1vZ29yb3YtU21pcm5vdui/nue7reWIhuW4g+ajgOmqjDog5qOA6aqM5Y2V5LiA5qC35pys5piv5LiN5piv5pyN5LuO5p+Q5LiA6aKE5YWI5YGH6K6+55qE54m55a6a5YiG5biD55qE5pa55rOV44CC5Lul5qC35pys5pWw5o2u55qE57Sv6K6h6aKR5pWw5YiG5biD5LiO54m55a6a55CG6K665YiG5biD5q+U6L6D77yM6Iul5Lik6ICF6Ze055qE5beu6Led5b6I5bCP77yM5YiZ5o6o6K666K+l5qC35pys5Y+W6Ieq5p+Q54m55a6a5YiG5biD5peP44CCDQoNCuivpeajgOmqjOWOn+WBh+iuvuS4ukgwOuaVsOaNrumbhuespuWQiHdlaWJ1bGzliIbluIPvvIxIMTrmoLfmnKzmiYDmnaXoh6rnmoTmgLvkvZPliIbluIPkuI3nrKblkIh3ZWlidWxs5YiG5biD44CC5LukRjAoeCnooajnpLrpooTlhYjlgYforr7nmoTnkIborrrliIbluIPvvIxGbih4KeihqOekuumaj+acuuagt+acrOeahOe0r+iuoeamgueOhyjpopHnjocp5Ye95pWwLg0KDQrnu5/orqHph49E5Li6OiBgRD1tYXh8RjAoeCkgLSBGbih4KXxgDQoNCkTlgLzotorlsI/vvIzotormjqXov5Ew77yM6KGo56S65qC35pys5pWw5o2u6LaK5o6l6L+Rd2VpYnVsbOWIhuW4gw0KcOWAvO+8jOWmguaenHAtdmFsdWXlsI/kuo7mmL7okZfmgKfmsLTlubPOsSgwLjA1Ke+8jOWImeaLkue7nUgwDQoNCmBgYHtyIEtvbG1vZ29yb3YtU21pcm5vdiB0ZXN0IFdlaWJ1bGx9DQpzZXQuc2VlZCgxKQ0KUzwtcndlaWJ1bGwoMTAwMCwxKQ0Ka3MudGVzdChTLCAicHdlaWJ1bGwiLDEpDQojIAlPbmUtc2FtcGxlIEtvbG1vZ29yb3YtU21pcm5vdiB0ZXN0DQojIGRhdGE6ICBTDQojIEQgPSAwLjAyNDQsIHAtdmFsdWUgPSAwLjU5MjgNCiMgYWx0ZXJuYXRpdmUgaHlwb3RoZXNpczogdHdvLXNpZGVkDQpgYGANCg0K57uT6K66OiBE5YC85b6I5bCPLCBwLXZhbHVlPjAuMDXvvIzkuI3og73mi5Lnu53ljp/lgYforr7vvIzmiYDku6XmlbDmja7pm4ZT56ym5ZCIc2hhcGU9MeeahHdlaWJ1bGzliIbluIPvvIENCg0KDQoNCuWcqOaIkeS7rOaOjOaPoeS6hu+8jOi/meWHoOenjeW4uOeUqOeahOi/nue7reWei+WIhuW4g+WQju+8jOaIkeS7rOWwseWPr+S7peWfuuS6jui/meS6m+WIhuW4g+adpeW7uuaooeS6hu+8jOW+iOWkmueahOeul+azleaooeWei+WwseiDveino+mHiumAmuS6hu+8ge+8gQ0KDQojIyDmpoLnjofliIbluIPlh73mlbDnmoTlm5vnp43lvaLlvI8NCg0K5YaF5a655pyJ5Yqp5LqO55CG6KejUueahOamgueOh+WIhuW4g+eahOWHoOenjeWHveaVsOivreazle+8jOeJueaxh+aAu+WmguS4i++8mg0KDQojIyMgMeOAgeamgueOh+WvhuW6puWHveaVsA0KDQrlrprkuYnvvJrlr7nku7vkuIDkuKrpmo/mnLrlj5jph49Y77yM5a2Y5Zyo5LiA5Liq5Ye95pWwZih4Ke+8jOa7oei2s+S7peS4iuadoeS7tu+8jOmCo+S5iOWwseivtO+8jGYoeCnmmK9Y55qE5qaC546H5a+G5bqm5Ye95pWw77yaIA0KDQrmhI/kuYnor7TmmI7vvJrmj4/ov7Dpmo/mnLrlj5jph4/lnKjmn5DkuIDkuKrnoa7lrprlj5blgLzngrnnmoTlj6/og73mgKfnmoTlh73mlbDvvIzmiJbogIXor7TmmK/nnqzml7blop7luYXnmoTkuIDkuKrlh73mlbDvvJogDQoNCg0KIyMjIDLjgIHntK/np6/liIbluIPlh73mlbANCg0K5a6a5LmJ77ya5a+55Lu75LiA6ZqP5py65Y+Y6YePWO+8jOWvueS6juS7u+aEj+e7meWumuWAvGHvvIzmiYDmnInlsI/kuo7lgLxh5Ye6546w55qE5qaC546H5ZKM77yM5bCx5piv6ZqP5py65Y+Y6YePWOeahOWIhuW4g+WHveaVsO+8jOWIhuW4g+WHveaVsOWPr+S7peWUr+S4gOWGs+WumuS4gOS4qumaj+acuuWPmOmHj++8mg0KDQrmgKfotKjvvJrvvIgx77yJ5pyJ55WM5oCn77yb77yIMu+8ieWNleiwg+aAp++8m++8iDPvvInlj7Pov57nu63mgKfjgIINCg0K57Sv56ev5YiG5biD5Ye95pWw55Sx5LqO6Iux5paH5Li6Q3VtdWxhdGl2ZSBEaXN0cmlidXRpb24gRnVuY3Rpb27vvIzmiYDku6Xnu4/luLjnroDnp7DkuLpDREbjgIINCg0KDQojIyMgM+OAgeWIhuS9jeaVsOWHveaVsA0KDQrlrprkuYnvvJrliIbkvY3mlbDlh73mlbDmmK/ntK/np6/liIbluIPlh73mlbDnmoTlj43lh73mlbDvvIzkuZ/lsLHmmK/or7TvvIznu5nlrprmpoLnjoflgLzvvIzorqHnrpflh7rpmo/mnLrlj5jph4/nmoTlj5blgLzvvIjlt6bkvqfliIbkvY3mlbDvvInjgIINCg0K5bi455So55qE5pyJ5Zub5Liq5YiG5biD55qE5YiG5L2N5pWw77yaDQoNCuagh+WHhuato+aAgeWIhuW4g++8jHFub3JtKHAsIG1lYW49MCwgc2Q9MSkNCg0KU3R1ZGVudOKAmXMgKHQpICwgcXQocCxkZj1OLG5jcD0wKQ0KDQrljaHmlrnliIbluIPvvJpxY2hpc3EocCwgZGY9TixuY3A9MCkNCg0KRmlzaGVyLVNuZWRlY29y77yacWYocCwgZGYxLGRmMixuY3A9MCkNCg0K54m55L6L77ya5Zub5YiG5L2N5pWwDQoNCuWumuS5ie+8muWbm+WIhuS9jeaVsOaYr+e7n+iuoeWtpuS4reWIhuS9jeaVsOeahOS4gOenje+8jOWNs+aKiuaJgOacieeahOaVsOWAvOS7juWwj+WIsOWkp+actOeDiOW5tuWIhuS4uuWbm+etieWIhu+8jOWkhOS6juS4ieS4quWIhuWJsueCueeahOaVsOWwseaYr+Wbm+WIhuS9jeaVsOOAgg0KDQoNCiMjIyA044CB6ZqP5py65pWw5Ye95pWwDQoNCuWumuS5ie+8jOS7juS4gOS4que7meWumuWHveaVsOeahOeahOWPluWAvOS4remaj+acuuaMkeWHuuS4gOS4quiHquWPmOmHj++8jOi+k+WHuueahOaYr+WboOWPmOmHj+eahOWAvOOAgg0KDQoNCiMjIyA144CB5Yeg5Liq5bi46KeB55qE6ZqP5py65Y+Y6YeP55qE5Zub56eN5Ye95pWw5b2i5byP77yaDQoNCiMjIyMg77yIMe+8iVRoZSBOb3JtYWwgRGlzdHJpYnV0aW9uDQpVc2FnZe+8mg0KZG5vcm0oeCwgbWVhbiA9IDAsIHNkID0gMSwgbG9nID0gRkFMU0UpDQpwbm9ybShxLCBtZWFuID0gMCwgc2QgPSAxLCBsb3dlci50YWlsID0gVFJVRSwgbG9nLnAgPSBGQUxTRSkNCnFub3JtKHAsIG1lYW4gPSAwLCBzZCA9IDEsIGxvd2VyLnRhaWwgPSBUUlVFLCBsb2cucCA9IEZBTFNFKQ0Kcm5vcm0obiwgbWVhbiA9IDAsIHNkID0gMSkNCg0KQXJndW1lbnRz77yaDQp4LHENCnZlY3RvciBvZiBxdWFudGlsZXMuDQpwDQp2ZWN0b3Igb2YgcHJvYmFiaWxpdGllcy4NCm4NCm51bWJlciBvZiBvYnNlcnZhdGlvbnMuIElmIGxlbmd0aChuKSA+IDEsIHRoZSBsZW5ndGggaXMgdGFrZW4gdG8gYmUgdGhlIG51bWJlciByZXF1aXJlZC4NCm1lYW4NCnZlY3RvciBvZiBtZWFucy4NCnNkDQp2ZWN0b3Igb2Ygc3RhbmRhcmQgZGV2aWF0aW9ucy4NCmxvZywgbG9nLnANCmxvZ2ljYWw7IGlmIFRSVUUsIHByb2JhYmlsaXRpZXMgcCBhcmUgZ2l2ZW4gYXMgbG9nKHApLg0KbG93ZXIudGFpbA0KbG9naWNhbDsgaWYgVFJVRSAoZGVmYXVsdCksIHByb2JhYmlsaXRpZXMgYXJlIFBbWCDiiaQgeF0gb3RoZXJ3aXNlLCBQW1ggPiB4XQ0KIA0KIyMjIyDvvIgy77yJ5Y2h5pa55YiG5biDDQpVc2FnZe+8mg0KZGNoaXNxKHgsIGRmLCBuY3A9MCwgbG9nID0gRkFMU0UpDQpwY2hpc3EocSwgZGYsIG5jcD0wLCBsb3dlci50YWlsID0gVFJVRSwgbG9nLnAgPSBGQUxTRSkNCnFjaGlzcShwLCBkZiwgbmNwPTAsIGxvd2VyLnRhaWwgPSBUUlVFLCBsb2cucCA9IEZBTFNFKQ0KcmNoaXNxKG4sIGRmLCBuY3A9MCkNCkFyZ3VtZW50c++8mg0KeCwgcQ0KdmVjdG9yIG9mIHF1YW50aWxlcy4NCnANCnZlY3RvciBvZiBwcm9iYWJpbGl0aWVzLg0Kbg0KbnVtYmVyIG9mIG9ic2VydmF0aW9ucy4gSWYgbGVuZ3RoKG4pID4gMSwgdGhlIGxlbmd0aCBpcyB0YWtlbiB0byBiZSB0aGUgbnVtYmVyIHJlcXVpcmVkLg0KZGYNCmRlZ3JlZXMgb2YgZnJlZWRvbSAobm9uLW5lZ2F0aXZlLCBidXQgY2FuIGJlIG5vbi1pbnRlZ2VyKS4NCm5jcA0Kbm9uLWNlbnRyYWxpdHkgcGFyYW1ldGVyIChub24tbmVnYXRpdmUpLg0KbG9nLCBsb2cucA0KbG9naWNhbDsgaWYgVFJVRSwgcHJvYmFiaWxpdGllcyBwIGFyZSBnaXZlbiBhcyBsb2cocCkuDQpsb3dlci50YWlsDQpsb2dpY2FsOyBpZiBUUlVFIChkZWZhdWx0KSwgcHJvYmFiaWxpdGllcyBhcmUgUFtYIOKJpCB4XSwgb3RoZXJ3aXNlLCBQW1ggPiB4XS4NCiANCiMjIyMg77yIM++8iUbliIbluIMNClVzYWdl77yaDQpkZih4LCBkZjEsIGRmMiwgbmNwLCBsb2cgPSBGQUxTRSkNCnBmKHEsIGRmMSwgZGYyLCBuY3AsIGxvd2VyLnRhaWwgPSBUUlVFLCBsb2cucCA9IEZBTFNFKQ0KcWYocCwgZGYxLCBkZjIsIG5jcCwgbG93ZXIudGFpbCA9IFRSVUUsIGxvZy5wID0gRkFMU0UpDQpyZihuLCBkZjEsIGRmMiwgbmNwKQ0KQXJndW1lbnRz77yaDQp4LCBxDQp2ZWN0b3Igb2YgcXVhbnRpbGVzLg0KcA0KdmVjdG9yIG9mIHByb2JhYmlsaXRpZXMuDQpuDQpudW1iZXIgb2Ygb2JzZXJ2YXRpb25zLiBJZiBsZW5ndGgobikgPiAxLCB0aGUgbGVuZ3RoIGlzIHRha2VuIHRvIGJlIHRoZSBudW1iZXIgcmVxdWlyZWQuDQpkZjEsIGRmMg0KZGVncmVlcyBvZiBmcmVlZG9tLiBJbmYgaXMgYWxsb3dlZC4NCm5jcA0Kbm9uLWNlbnRyYWxpdHkgcGFyYW1ldGVyLiBJZiBvbWl0dGVkIHRoZSBjZW50cmFsIEYgaXMgYXNzdW1lZC4NCmxvZywgbG9nLnANCmxvZ2ljYWw7IGlmIFRSVUUsIHByb2JhYmlsaXRpZXMgcCBhcmUgZ2l2ZW4gYXMgbG9nKHApLg0KbG93ZXIudGFpbA0KbG9naWNhbDsgaWYgVFJVRSAoZGVmYXVsdCksIHByb2JhYmlsaXRpZXMgYXJlIFBbWCDiiaQgeF0sIG90aGVyd2lzZSwgUFtYID4geF0uDQoNCiMjIyMg77yINO+8iVTliIbluIMNClVzYWdl77yaDQpkdCh4LCBkZiwgbmNwLCBsb2cgPSBGQUxTRSkNCnB0KHEsIGRmLCBuY3AsIGxvd2VyLnRhaWwgPSBUUlVFLCBsb2cucCA9IEZBTFNFKQ0KcXQocCwgZGYsIG5jcCwgbG93ZXIudGFpbCA9IFRSVUUsIGxvZy5wID0gRkFMU0UpDQpydChuLCBkZiwgbmNwKQ0KQXJndW1lbnRz77yaDQp4LCBxDQp2ZWN0b3Igb2YgcXVhbnRpbGVzLg0KcA0KdmVjdG9yIG9mIHByb2JhYmlsaXRpZXMuDQpuDQpudW1iZXIgb2Ygb2JzZXJ2YXRpb25zLiBJZiBsZW5ndGgobikgPiAxLCB0aGUgbGVuZ3RoIGlzIHRha2VuIHRvIGJlIHRoZSBudW1iZXIgcmVxdWlyZWQuDQpkZg0KZGVncmVlcyBvZiBmcmVlZG9tICg+IDAsIG1heWJlIG5vbi1pbnRlZ2VyKS4gZGYgPSBJbmYgaXMgYWxsb3dlZC4NCm5jcA0Kbm9uLWNlbnRyYWxpdHkgcGFyYW1ldGVyIGRlbHRhOyBjdXJyZW50bHkgZXhjZXB0IGZvciBydCgpLCBvbmx5IGZvciBhYnMobmNwKSA8PSAzNy42Mi4gSWYgb21pdHRlZCwgdXNlIHRoZSBjZW50cmFsIHQgZGlzdHJpYnV0aW9uLg0KbG9nLCBsb2cucA0KbG9naWNhbDsgaWYgVFJVRSwgcHJvYmFiaWxpdGllcyBwIGFyZSBnaXZlbiBhcyBsb2cocCkuDQpsb3dlci50YWlsDQpsb2dpY2FsOyBpZiBUUlVFIChkZWZhdWx0KSwgcHJvYmFiaWxpdGllcyBhcmUgUFtYIOKJpCB4XSwgb3RoZXJ3aXNlLCBQW1ggPiB4XS4NCg0KIyMg5pWw5a2m5LiO57uf6K6h55u45YWz5Ye95pWw5LiO5pyv6K+tDQpgYGB7cn0NCg0KIyMjIyMjIyMjIyMjIyMjIw0KIyMj6K6h566XDQojIyMjIyMjIyMjIyMjIyMjDQoNCiPlm5vliJnov5DnrpcgKywgLSwgKiwgLywgXiwgJSUsICUvJQ0KI+iIjeWFpSBjZWlsaW5n77yMZmxvb3LvvIxyb3VuZO+8jHNpZ25pZu+8jHRydW5j77yMemFwc21hbGwNCiPmnIDlpKfmnIDlsI/lgLwgbWF477yMbWlu77yMcG1heO+8jHBtaW4NCiPmnIDlpKflgLzlkozmnIDlsI/lgLwgcmFuZ2UNCiPlkJHph4/lhYPntKDlkozvvIznp68gc3Vt77yMcHJvZA0KI+e0r+WKoOOAgee0r+S5mCBjdW1zdW3vvIxjdW1wcm9k77yMY3VtbWF477yMY3VtbWluDQoj5o6S5bqPIHNvcnQNCiPmj5LlgLwgYXBwcm945ZKMYXBwcm94IGZ1bg0KI+W3ruWIhiBkaWZmDQoj56ym5Y+35Ye95pWwIHNpZ24NCg0KIyMjIyMjIyMjIyMjIyMjIw0KIyMj5pWw5a2m5Ye95pWwDQojIyMjIyMjIyMjIyMjIyMjDQoNCiPnu53lr7nlgLzvvIzlubPmlrnmoLkgYWJz77yMc3FydA0KI+WvueaVsOS4juaMh+aVsOWHveaVsCBsb2csIGV4cCwgbG9nMTAsIGxvZzINCiPkuInop5Llh73mlbAgc2lu77yMY29z77yMdGFu77yMYXNpbu+8jGFjb3PvvIxhdGFu77yMYXRhbjINCiPlj4zmm7Llh73mlbAgc2luaO+8jGNvc2jvvIx0YW5o77yMYXNpbmjvvIxhY29zaO+8jGF0YW5oDQoj5LiO6LSd5aGU5Ye95pWw44CB5Ly9546b5Ye95pWw44CB57uE5ZCI5pWw5pyJ5YWz55qE54m55q6K5Ye95pWwIGJldGHvvIxsYmV0Ye+8jGdhbW1h77yMbGdhbW1h77yMZGlnYW1tYe+8jHRyaWdhbW1h77yMdGV0cmFnYW1tYe+8jHBlbnRhZ2FtbWHvvIxjaG9vc2Ug77yMbGNob29zZQ0KI+WvjOWIqeWPtuWPmOaNouWPiuWNt+enryBmZnTvvIxtdmZmdO+8jGNvbnZvbHZlDQoj5aSa6aG55byP5rGC5qC5IHBvbHlyb290DQoj5q2j5Lqk5aSa6aG55byPIHBvbHkNCiPmoLfmnaHlt67lgLwgc3BsaW5l77yMc3BsaW5lZnVuDQoj5Ye95pWwIGJlc3NlbEnvvIxiZXNzZWxL77yMYmVzc2VsSu+8jGJlc3NlbFnvvIxnYW1tYUNvZHlCZXNzZWwNCiPnroDljZXooajovr7lvI/nmoTnrKblj7flvq7liIbmiJbnrpfms5Xlvq7liIYgZGVyaXYNCg0KIyMjIyMjIyMjIyMjIyMjIw0KIyMj57q/5oCn5Luj5pWwDQojIyMjIyMjIyMjIyMjIyMjDQoj6Kej57q/5oCn5pa556iL57uE5oiW5rGC6YCGIHNvbHZlDQoj55+p6Zi155qE54m55b6B5YC85YiG6KejIGVpZ2VuDQoj55+p6Zi155qE5aWH5byC5YC85YiG6KejIHN2ZA0KI+ino+S4iuS4ieinkuaIluS4i+S4ieinkuaWueeoi+e7hCBiYWNrc29sdmUNCiPliIbop6MgY2hvbENob2xlc2tpDQoj55+p6Zi155qEUVLliIbop6MgcXINCiPnlLFDaG9sZXNraeWIhuino+axgumAhiBjaG9sMmludg0KDQojIyMjIyMjIyMjIyMjIyMjDQojIyPkvJjljJblj4rmsYLmoLkNCiMjIyMjIyMjIyMjIyMjIyMNCiPkuIDnu7TkvJjljJbkuI7msYLmoLkgb3B0aW1pemUgdW5pcm9vdCBwb2x5cm9vdA0KDQojIyMjIyMjIyMjIyMjIyMjDQojIyPnu5/orqHliIbluIMNCiMjIyMjIyMjIyMjIyMjIyMNCiPmr4/kuIDnp43liIbluIPmnInlm5vkuKrlh73mlbANCiPmr5TlpoLvvIzmraPmgIHliIbluIPnmoTov5nlm5vkuKrlh73mlbDkuLpkbm9ybe+8jHBub3Jt77yMcW5vcm3vvIxybm9ybeOAgg0KIyBk4oCV4oCVZGVuc2l0ee+8iOWvhuW6puWHveaVsO+8iQ0KIyBw4oCV4oCV5YiG5biD5Ye95pWwDQojIHHigJXigJXliIbkvY3mlbDlh73mlbANCiMgcuKAleKAlemaj+acuuaVsOWHveaVsA0KDQoj5LiL6Z2i5oiR5Lus5YiX5Ye65ZCE5YiG5biD5ZCO57yA77yM5YmN6Z2i5Yqg5YmN57yAZOOAgXDjgIFx5oiWcuWwseaehOaIkOWHveaVsOWQjQ0KI+ato+aAgSBub3JtDQoj5YiG5biDIHR0DQoj5YiG5biDIGZGDQoj5Y2h5pa577yI5YyF5ous6Z2e5Lit5b+D77yJIGNoaXNxDQoj5Z2H5YyAIHVuaWYNCiPmjIfmlbAgZXhwDQoj5aiB5biD5bCUIHdlaWJ1bGwNCiPkvL3njpsgZ2FtbWENCiPotJ3loZQgYmV0YSANCiPlr7nmlbDmraPmgIEgbG5vcm0NCiPpgLvovpHliIbluIMgbG9naXMNCiPmn6/opb8gY2F1Y2h5DQoj5LqM6aG55YiG5biDIGJpbm9tDQoj5Yeg5L2V5YiG5biDIGdlb20NCiPotoXlh6DkvZUgaHlwZXINCiPotJ/kuozpobkgbmJpbm9tDQoj5rOK5p2+IHBvaXMNCg0KI+espuWPt+enqSBzaWducmFuaw0KI+enqeWSjCB3aWxjb3gNCiPlrabnlJ/ljJbmnoHlt64gdHVrZXkNCg0KIyMjIyMjIyMjIyMjIyMjIw0KIyMj566A5Y2V57uf6K6h6YePDQojIyMjIyMjIyMjIyMjIyMjDQoj5Z+65pys57uf6K6h6YePDQoj5rGC5ZKMIHN1bQ0KI+axguW5s+WdhyBtZWFuDQoj5pa55beuIHZhcg0KI+agh+WHhuW3riBzZA0KI+acgOWwj+WAvCBtaW4NCiPmnIDlpKflgLwgbWF4DQoj5pyA5bCP5ZKM5pyA5aSn5YC8IHJhbmdlDQoj5Lit5L2N5pWwIG1lZGlhbg0KI+Wbm+WIhuS9jemXtOi3nSBJUVINCiPkuI7mjpLluo/mnInlhbMgc29ydCBvcmRlciByYW5rDQoj5YW25a6D6L+Y5pyJIGF2ZSBmaXZlbnVtIG1hZCBxdWFudGlsZSBzdGVtIA0KDQojIyMjIyMjIyMjIyMjIyMjDQojIyPnu5/orqHmo4DpqowNCiMjIyMjIyMjIyMjIyMjIyMNCiNS5Lit5bey5a6e546w55qE5pyJIGNoaXNxLnRlc3QscHJvcC50ZXN0LHQudGVzdA0KDQojIyMjIyMjIyMjIyMjIyMjDQojIyPlpJrlhYPliIbmnpANCiMjIyMjIyMjIyMjIyMjIyMNCiPljY/mlrnlt67pmLXlj4rnm7jlhbPpmLXorqHnrpcgY29yLGNvdi53dCx2YXINCiPlpJrlhYPmlbDmja4gYmlwbG90LCBiaXBsb3QucHJpbmNvbXANCiPlhbjliJnnm7jlhbMgYmlwbG90IGNhbmNvcg0KI+S4u+aIkOWIhuWIhuaekCBwcmluY29tcA0KI+iwseezu+iBmuexuyBoY2x1c3QNCiNrLeWdh+WAvOiBmuexuyBrbWVhbnMNCiPnu4/lhbjlpJrnu7TmoIfluqYgY21kc2NhbGUNCiPlhbblroPmnIkgIGRpc3QsbWFoYWxhbm9iaXMsY292LnJvYg0KDQojIyMjIyMjIyMjIyMjIyMjDQojIyPml7bpl7Tluo/liJcNCiMjIyMjIyMjIyMjIyMjIyMNCiPml7bpl7Tluo/liJflr7nosaEgdHMNCiPorqHnrpflt67liIYgZGlmZg0KI+aXtumXtOW6j+WIl+eahOmHh+agt+aXtumXtCB0aW1lDQoj5pe26Ze056qXIHdpbmRvdw0KDQojIyMjIyMjIyMjIyMjIyMjDQojIyPnu5/orqHmqKHlnosNCiMjIyMjIyMjIyMjIyMjIyMNCiMg57q/5oCn5qih5Z6LIGxtDQojIOW5v+S5iee6v+aAp+aooeWeiyBnbG0NCiMg5pa55beu5YiG5p6QIGFvdg0KYGBgDQoNCg==